// ==UserScript==
// @name 奶牛复制助手
// @namespace http://tampermonkey.net/
// @version 1.2
// @description 银河奶牛放置复制助手,安装后页面会出现一个悬浮按钮,点击可以复制常用短语,然后粘贴到聊天栏中。这些短语可以自行修改。
// @author XiaoR
// @match https://www.milkywayidle.com/*
// @grant GM_setValue
// @grant GM_getValue
// @license MIT
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// 初始化配置
let config = {
phrases: GM_getValue('phrases',
['分解糖(0-10)→苹果(10-20)→橙子(20-35)→竹子/紫茶叶(35-50)→桃子/月亮茶(50-65)→红茶叶(65-80)',
'重组海洋精华(炼金1级)→丛林精华(10-23级)→哥布林精华(23-45级)→眼球精华(45-53级)→熊熊精华(53-65级)',
'牛牛新人攻略https://test-ctmd6jnzo6t9.feishu.cn/docx/KG9ddER6Eo2uPoxJFkicsvbEnCe',
'社交-推荐 可以看邀请链接',
'牛牛官方群:482088950',
'因为有经验buff',
'公会没有任何加成',
'法师35级前没有副手',
'背部装备只有后期才有',
'🔥《银河牛牛放置》震撼公测!爆率玄学堪比老板画饼,强化失败自动播放《大悲咒》助你顿悟!点击就送【996福报】,群号482088950,群内基佬南娘过多,需要帮助请发送牛牛手册',
'新手不用纠结玩什么,职业强度都是你挂机一年后才能体会到的东西。到时候都变天了,喜欢玩什么玩什么。',
'牛牛新手路线图https://pic1.imgdb.cn/item/67d0325a066befcec6e358fd.png',
'战斗装备得有4000M左右,收益才能和生活持平。',
'技能是释放顺序是从左到右,0cd的要放在右边'
]),
position: GM_getValue('position', {x: 30, y: 30})
};
const defaultPhrases = [
'分解糖(0-10)→苹果(10-20)→橙子(20-35)→竹子/紫茶叶(35-50)→桃子/月亮茶(50-65)→红茶叶(65-80)',
'重组海洋精华(炼金1级)→丛林精华(10-23级)→哥布林精华(23-45级)→眼球精华(45-53级)→熊熊精华(53-65级)',
'牛牛新人攻略https://test-ctmd6jnzo6t9.feishu.cn/docx/KG9ddER6Eo2uPoxJFkicsvbEnCe',
'社交-推荐 可以看邀请链接',
'牛牛官方群:482088950',
'因为有经验buff',
'公会没有任何加成',
'法师35级前没有副手',
'背部装备只有后期才有',
'🔥《银河牛牛放置》震撼公测!爆率玄学堪比老板画饼,强化失败自动播放《大悲咒》助你顿悟!点击就送【996福报】,群号482088950,群内基佬南娘过多,需要帮助请发送牛牛手册',
'新手不用纠结玩什么,职业强度都是你挂机一年后才能体会到的东西。到时候都变天了,喜欢玩什么玩什么。',
'牛牛新手路线图https://pic1.imgdb.cn/item/67d0325a066befcec6e358fd.png',
'战斗装备得有4000M左右,收益才能和生活持平。',
'技能是释放顺序是从左到右,0cd的要放在右边'
];
// 创建UI样式
const createStyles = () => {
const style = document.createElement('style');
style.textContent = `
.mwc-container {
position: fixed;
z-index: 99999;
transform: translate(-50%, -50%);
}
.mwc-main-btn {
width: 48px;
height: 48px;
border-radius: 24px;
background: linear-gradient(135deg, #6366f1, #8b5cf6);
border: none;
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
cursor: move;
transition: all 0.3s;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-size: 24px;
}
.mwc-main-btn:hover {
transform: scale(1.1);
box-shadow: 0 6px 16px rgba(0,0,0,0.3);
}
.mwc-menu {
position: absolute;
left: 60px;
top: 0;
background: rgba(255,255,255,0.95);
border-radius: 12px;
padding: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
backdrop-filter: blur(8px);
min-width: 200px;
display: none;
}
.mwc-menu-item {
padding: 12px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
color: #374151;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
}
.mwc-menu-item:hover {
background: rgba(99,102,241,0.1);
transform: translateX(4px);
}
.mwc-config {
background: white;
padding: 20px;
border-radius: 16px;
box-shadow: 0 8px 24px rgba(0,0,0,0.1);
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 100000;
display: none;
width: 400px;
}
.mwc-config-item {
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
.mwc-config-input {
flex: 1;
padding: 8px;
border: 1px solid #e5e7eb;
border-radius: 8px;
}
.mwc-add-btn {
width: 100%;
padding: 8px;
background: #f3f4f6;
border: 1px dashed #d1d5db;
border-radius: 8px;
cursor: pointer;
color: #6b7280;
margin-bottom: 16px;
}
.mwc-add-btn:hover {
background: #e5e7eb;
}
.mwc-delete-btn {
color: #ef4444;
cursor: pointer;
padding: 4px;
border-radius: 4px;
}
.mwc-delete-btn:hover {
background: #fee2e2;
}
.mwc-toast {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
background: linear-gradient(135deg, #10b981, #059669);
color: white;
padding: 12px 24px;
border-radius: 8px;
display: none;
animation: slideIn 0.3s;
}
@keyframes slideIn {
from { bottom: -50px }
to { bottom: 20px }
}
`;
document.head.appendChild(style);
};
// 创建配置面板
const createConfigPanel = (menu) => {
const panel = document.createElement('div');
panel.className = 'mwc-config';
panel.addEventListener('click', e => e.stopPropagation());
panel.innerHTML = `
短语管理
`;
const phrasesContainer = panel.querySelector('#mwc-phrases-container');
const addBtn = panel.querySelector('.mwc-add-btn');
// 添加新短语
addBtn.addEventListener('click', () => {
const item = document.createElement('div');
item.className = 'mwc-config-item';
item.innerHTML = `
🗑️
`;
phrasesContainer.appendChild(item);
});
phrasesContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('mwc-delete-btn')) {
e.stopPropagation(); // 阻止事件冒泡
e.target.closest('.mwc-config-item').remove();
}
});
panel.querySelector('button:first-child').addEventListener('click', () => {
const inputs = phrasesContainer.querySelectorAll('.mwc-config-input');
config.phrases = Array.from(inputs).map(input => input.value.trim()).filter(Boolean);
GM_setValue('phrases', config.phrases);
updatePhrases(menu);
panel.style.display = 'none';
});
// 取消
panel.querySelector('button:last-child').addEventListener('click', () => {
panel.style.display = 'none';
});
panel.querySelector('.mwc-reset-btn').addEventListener('click', () => {
if (confirm('确定要恢复默认短语吗?当前所有修改将会丢失!')) {
config.phrases = [...defaultPhrases];
GM_setValue('phrases', config.phrases);
const phrasesContainer = panel.querySelector('#mwc-phrases-container');
phrasesContainer.innerHTML = '';
config.phrases.forEach(text => {
const item = document.createElement('div');
item.className = 'mwc-config-item';
item.innerHTML = `
🗑️
`;
phrasesContainer.appendChild(item);
});
updatePhrases(menu);
showToast('✅ 已恢复默认短语');
}
});
return panel;
};
// 更新短语菜单
const updatePhrases = (menu) => {
// 先移除所有非配置按钮的菜单项
const existingItems = menu.querySelectorAll('.mwc-menu-item:not(.mwc-config-btn)');
existingItems.forEach(n => n.remove());
// 添加新短语项
config.phrases.forEach((text) => {
const btn = document.createElement('div');
btn.className = 'mwc-menu-item';
btn.textContent = text;
btn.addEventListener('click', () => {
navigator.clipboard.writeText(text);
showToast('✅ 复制成功');
});
menu.insertBefore(btn, menu.querySelector('.mwc-config-btn'));
});
};
// 显示Toast提示
const showToast = (message) => {
const toast = document.createElement('div');
toast.className = 'mwc-toast';
toast.textContent = message;
document.body.appendChild(toast);
toast.style.display = 'block';
setTimeout(() => toast.remove(), 2000);
};
// 初始化拖拽功能
const initDrag = (container) => {
let isDragging = false;
let startX = 0;
let startY = 0;
container.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX - container.offsetLeft;
startY = e.clientY - container.offsetTop;
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
container.style.left = `${e.clientX - startX}px`;
container.style.top = `${e.clientY - startY}px`;
});
document.addEventListener('mouseup', () => {
if (!isDragging) return;
isDragging = false;
GM_setValue('position', {
x: parseInt(container.style.left),
y: parseInt(container.style.top)
});
});
};
// 主初始化函数
const init = () => {
createStyles();
// 创建主界面
const container = document.createElement('div');
container.className = 'mwc-container';
container.style.left = `${config.position.x}px`;
container.style.top = `${config.position.y}px`;
const mainBtn = document.createElement('button');
mainBtn.className = 'mwc-main-btn';
mainBtn.textContent = '+';
container.appendChild(mainBtn);
const menu = document.createElement('div');
menu.className = 'mwc-menu';
const configBtn = document.createElement('div');
configBtn.className = 'mwc-menu-item mwc-config-btn'; // 添加特殊类名
configBtn.textContent = '⚙️ 管理短语';
menu.appendChild(configBtn);
container.appendChild(menu);
document.body.appendChild(container);
// 创建配置面板
const configPanel = createConfigPanel(menu);
document.body.appendChild(configPanel);
// 初始化功能
initDrag(container);
updatePhrases(menu);
// 主按钮点击
mainBtn.addEventListener('click', () => {
menu.style.display = menu.style.display === 'block' ? 'none' : 'block';
});
// 打开配置面板
configBtn.addEventListener('click', () => {
const phrasesContainer = configPanel.querySelector('#mwc-phrases-container');
phrasesContainer.innerHTML = '';
config.phrases.forEach(text => {
const item = document.createElement('div');
item.className = 'mwc-config-item';
item.innerHTML = `
🗑️
`;
phrasesContainer.appendChild(item);
});
configPanel.style.display = 'block';
});
// 点击外部关闭
document.addEventListener('click', (e) => {
if (!e.target.closest('.mwc-container') && !e.target.closest('.mwc-config')) {
menu.style.display = 'none';
configPanel.style.display = 'none';
}
});
};
window.addEventListener('load', init);
})();