// ==UserScript== // @name 自动换装 // @namespace http://your-namespace.com // @version 2026-06-05 // @description 页面元素监控与操作 // @author 生猛的程序 // @match https://aring.cc/awakening-of-war-soul-ol/ // @grant none // ==/UserScript== (function() { 'use strict'; //----如果复制不了装备F12 检查Sources下的assets/index-****.js是否匹配,不匹配需要重更新复制路径替换下面这个变量 let jsPath //= `https://aring.cc/awakening-of-war-soul-ol/assets/index-nMbDFSxf.js`; let checkType=1; //---共斗类型 0 普通 1 进阶 特别说明【战斗换装优先级高于共斗】 const publicData=[] //{'hp':30,'cin':5,'ctype':1}---【共斗】装备规则切换 hp 血量值 cin 装备套路位置 ctype : 0 大于 1 小于 const pkData=[] //---【挑战】装备规则切换 hp 血量值 cin 装备套路位置 ctype : 0 大于 1 小于 //---------------------------------换装UI const htmlData= { styles:` /* 弹窗遮罩 */ .modal-overlay-change { position: fixed; top: 0; width: 100%; max-width: 540px; height: 100%; box-sizing: border-box; background-color: rgba(0, 0, 0, 0.6); display: flex; justify-content: center; align-items: center; z-index: 1000; opacity: 0; visibility: hidden; left: 50%; /* 居中定位 */ transform: translateX(-50%); /* 水平居中 */ } .modal-overlay-change.show { opacity: 1; visibility: visible; } /* 弹窗主体 */ .modalchange { background-color: #000; box-sizing: border-box; border: 2px solid #fff; border-radius: 10px; margin: 0 auto; padding: 15px; width: 90%; max-width: 500px; max-height: 90vh; overflow-y: auto; transform: scale(0.7); transition: transform 0.3s ease; } @media (min-width: 1001px) { .modal-overlay.show { position: fixed; transform: scale(1); /* 定位到右侧 */ left: auto; right: calc(50% - 770px); } } .modal-overlay-change.show .modalchange { transform: scale(1); } /* 顶部模块样式 */ .input-module { background-color: #1e1e1e; padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 1px solid #333; } .input-module h2 { margin-bottom: 15px; } .form-group { display: flex; flex-wrap: wrap; margin-bottom: 15px; } .form-row { display: flex; gap: 15px; min-width: 0; /* 添加这一行 */ margin-bottom: 15px; } .condition-btn { flex: 1; /* 平均分配剩余空间 */ background-color: #444444; padding: 8px 5px; border: none; color: #999; border-radius: 3px; cursor: pointer; font-size: 0.9em; } .condition-btn:hover { background-color: #555555; } .condition-btn.active { color: white; background-color: #0066cc; } .form-row:last-child { margin-bottom: 0; } .button-item { flex: 0 0 auto; } .button-item .add-btn, .button-item .complete-btn { width: auto; padding: 10px 20px; min-width: 80px; } .button-group { display: flex; gap: 8px; width: 100%; /* 确保容器占满父元素宽度 */ } .complete-btn { background-color: #28a745; color: white; border: 1px solid #444; border-radius: 4px; cursor: pointer; font-size: 14px; align-self: center; } .complete-btn:hover { background-color: #218838; } .form-change-item { display: flex; flex-direction: column; flex: 1 1 0; /* 明确设置 flex 属性 */ min-width: 0; } .form-change-item label { margin-bottom: 5px; font-size: 14px; } .form-change-item input { padding: 10px; background-color: #2d2d2d; border: 1px solid #444; border-radius: 4px; color: white; font-size: 14px; min-width: 0; /* 添加这一行 */ } .form-change-item select { padding: 7px; background-color: #2d2d2d; border: 1px solid #444; border-radius: 4px; color: white; font-size: 14px; min-width: 0; /* 添加这一行 */ } .form-change-item input:focus, .form-change-item select:focus { outline: none; border-color: #666; } .button-item { flex: 0 0 auto; } .add-btn { align-self: center; padding: 10px 20px; background-color: #333; color: white; border: 1px solid #444; border-radius: 4px; cursor: pointer; font-size: 14px; } .add-btn:hover { background-color: #444; } /* 中间列表模块样式 */ /* 中间列表模块样式 */ .list-module { background-color: #1e1e1e; padding: 10px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333; } .list-module ul { padding-inline-start: 0; /* 重置默认内边距 */ padding-left: 0; /* 兼容性处理 */ margin: 0; /* 如需要也可重置外边距 */ } .list-module h3 { margin-bottom: 6px; } .boss-list { list-style: none; } .boss-item { display: flex; justify-content: space-between; align-items: flex-start; /* 改为flex-start */ padding: 3px 5px; background-color: #2d2d2d; margin-bottom: 8px; border-radius: 4px; border: 1px solid #444; cursor: pointer; } .boss-item .content-wrapper { flex: 1; margin-right: 8px; } .delete-child-btn, .content-wrapper { align-self: center; /* 垂直居中 */ flex-shrink: 0; /* 防止按钮被压缩 */ } .boss-item:hover { background-color: #333; } .boss-item.selected { background-color: #444; border-color: #666; } .delete-btn, .delete-child-btn { background-color: #dc3545; color: white; border: none; padding: 5px 10px; border-radius: 4px; cursor: pointer; font-size: 12px; } .delete-btn:hover, .delete-child-btn:hover { background-color: #c82333; } /* 底部详情模块样式 */ .detail-module { background-color: #1e1e1e; padding: 10px; border-radius: 8px; border: 1px solid #333; } .detail-module ul { padding-inline-start: 0; /* 重置默认内边距 */ padding-left: 0; /* 兼容性处理 */ margin: 0; /* 如需要也可重置外边距 */ } .detail-module h3 { margin-bottom: 15px; } .detail-content { display: flex; flex-direction: column; gap: 10px; } .detail-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid #333; } .detail-label { font-weight: bold; } .detail-value { text-align: right; } .no-selection { text-align: center; color: #888; padding: 20px; } .detail-delete-btn { align-self: flex-end; background-color: #dc3545; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-size: 14px; margin-top: 10px; } .detail-delete-btn:hover { background-color: #c82333; }`, bodyv:` `, buttonXML:` ` } function findMsg(){ //const listview = document.querySelector('dungeon-list'); //const listview = document.querySelectorAll('.dungeon.affix'); // 获取父容器和所有子元素 const container = document.querySelector('.home-btn-wrap'); if (container) { initView(); const children = container.children; // 创建新元素 const newElement = document.createElement(`div`); newElement.className = 'common-btn-wrap'; newElement.setAttribute(`color`,"#626aef") newElement.setAttribute(`dark`,"true") newElement.setAttribute(`data-v-ab3b4a1b`,"") newElement.setAttribute(`style`,"grid-column: span 3;width:100%;") newElement.innerHTML = htmlData.buttonXML; // 添加点击事件(可选) newElement.addEventListener('click', () => { // console.log('新按钮被点击',T); document.getElementById('modalOverChangelay').classList.add('show'); }); container.appendChild(newElement); }else{ //每隔10秒一刷新 setTimeout(findMsg, 2000); } } function initView(){ injectStyleTag() injectDivTag() // 点击遮罩关闭弹窗 document.getElementById('modalOverChangelay').addEventListener('click', function(e) { if (e.target === this) { closeModal(); } }); // ESC键关闭弹窗 document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { closeModal(); } }); bossNameInput = document.getElementById('bossName'); bossHealthInput = document.getElementById('bossHealth'); equipmentPlanSelect = document.getElementById('equipmentPlan'); addBtn = document.getElementById('addBtn'); completeBtn = document.getElementById('completeBtn'); bossList = document.getElementById('bossList'); aboveBtn = document.getElementById('aboveBtn'); belowBtn = document.getElementById('belowBtn'); detailContent = document.getElementById('detailContent'); // 在页面加载时初始化数据 loadData(); loadBossData(); createListener(); } function closeModal() { document.getElementById('modalOverChangelay').classList.remove('show'); } function injectStyleTag() { const style = document.createElement('style'); style.type = 'text/css'; style.textContent = htmlData.styles; document.head.appendChild(style); } function injectDivTag() { const div = document.createElement('div'); div.innerHTML = htmlData.bodyv document.body.appendChild(div); } function findIndexJS(){ const scripts = document.querySelectorAll('script[src]'); scripts.forEach(script => { const src = script.src; if (src.includes('assets') && src.includes('index') && src.endsWith('.js')) { jsPath=src; findMsg() return // console.log('找到目标文件:', src); } }); console.log('文件筛选完毕:'); } setTimeout(findIndexJS, 2000); // 数据存储 let savekey='' let bossData = []; let isLarge = true; let selectedBossId = null; let selectedChildId = null; let equippedRoutineList = []// DOM元素 let bossNameInput = document.getElementById('bossName'); let bossHealthInput = document.getElementById('bossHealth'); let equipmentPlanSelect = document.getElementById('equipmentPlan'); let addBtn = document.getElementById('addBtn'); let completeBtn = document.getElementById('completeBtn'); let bossList = document.getElementById('bossList'); let aboveBtn = document.getElementById('aboveBtn'); let belowBtn = document.getElementById('belowBtn'); let detailContent = document.getElementById('detailContent'); let UserData =null function loadData(){ if(!jsPath){ return; } if(UserData){ initEquipmentPlans() }else{ const getModuleExports = async () => { try { const module = await import(jsPath); // 替换为实际路径 const data={}; data.userD=module.u; return data; } catch (e) { console.error('模块加载失败:', e); } } getModuleExports().then(tool => { tool && (UserData=tool.userD,initEquipmentPlans()); }); } } function createListener(){ // 添加BOSS addBtn.addEventListener('click', () => { atkDataWrite(false) }); completeBtn.addEventListener('click', () => { //这里是修改 //clearForm(true); atkDataWrite(true) }); aboveBtn.addEventListener('click', () => { changeCondition(1) }); belowBtn.addEventListener('click', () => { changeCondition(2) }); } function atkDataWrite(isupdate){ const name = bossNameInput.value.trim(); let hp = bossHealthInput.value.trim(); // 解析选中的装备方案信息 const selectedPlan = JSON.parse(equipmentPlanSelect.value); const planId = selectedPlan.id; const planName = selectedPlan.name; if (!name) { alert('请输入BOSS名称'); return; } const newBoss = { id: Date.now(), hp: hp || '未设置', isLarge: isLarge, bossName: name, planId: planId, // 记录ID planName: planName // 记录name }; let bossModel = bossData.find(item => item.bossName === name); let isNew = false; if (!bossModel) { bossModel = { id: Date.now() + 300, } isNew = true bossModel.bossName = name // 记录name bossModel.atks = [] // 记录name } if(isupdate){ let bossatk = bossModel.atks.find(item => item.id === selectedChildId); bossatk.hp = hp; bossatk.isLarge = isLarge; bossatk.planId = planId; bossatk.planName = planName; } !isupdate && bossModel.atks.push(newBoss); isNew && bossData.push(bossModel); saveBossData(); renderBossList(); renderDetail(); clearForm(false); completeBtn.style.display = 'none'; } // 初始化装备方案下拉框数据 function initEquipmentPlans() { // 清空现有选项 equipmentPlanSelect.innerHTML = ''; if(!UserData){ return } const r = UserData() if(r.username){ savekey=r.username // 添加新选项 let itemindex=1; r.equippedRoutineList.forEach(item => { const option = document.createElement('option'); option.value = JSON.stringify({ id: itemindex, name: item.name }); // 存储ID和name option.textContent = item.name; equipmentPlanSelect.appendChild(option); itemindex++; }); loadBossData() }else{ setTimeout(initEquipmentPlans, 2000); } } function changeCondition(clicktype) { isLarge = clicktype == 1; if (isLarge) { aboveBtn.classList.add('active'); belowBtn.classList.remove('active'); } else { aboveBtn.classList.remove('active'); belowBtn.classList.add('active'); } } // 渲染BOSS列表 function renderBossList() { bossList.innerHTML = ''; if (bossData.length === 0) { bossList.innerHTML = '
暂无数据
'; return; } bossData && bossData.length > 0 && bossData.forEach(boss => { const li = document.createElement('div'); li.className = 'boss-item'; li.dataset.id = boss.id; if (boss.id === selectedBossId) { li.classList.add('selected'); } const delBtn=``; li.innerHTML = `
针对${boss.bossName},共有${boss.atks.length}个阶段
${boss.bossName==='通用'?'':delBtn} `; li.addEventListener('click', (e) => { if (e.target.classList.contains('delete-btn')) return; selectBoss(boss.id); }); bossList.appendChild(li); }); // 绑定删除事件 document.querySelectorAll('.delete-btn').forEach(btn => { btn.addEventListener('click', (e) => { e.stopPropagation(); const id = parseInt(btn.dataset.id); deleteBoss(id); }); }); } // 选择方案 function selectBoss(id) { selectedBossId = id; renderBossList(); renderDetail(true); } // 选择方案阶段 function selectBossChild(atsModel) { selectedChildId = atsModel.id; renderDetail(); //--填充详情 bossHealthInput.value = atsModel.hp || ''; equipmentPlanSelect.selectedIndex = Number(atsModel.planId) - 1; bossNameInput.value = atsModel.bossName || ''; changeCondition(atsModel.isLarge ? 1 : 2) //completeBtn.innerHTML = '修改'ff completeBtn.style.display = 'block'; } function isNumeric(value) { return typeof value === 'number' || (typeof value === 'string' && !isNaN(value) && !isNaN(parseFloat(value))); } // 渲染详情 function renderDetail(click) { const boss = bossData.find(item => item.id === selectedBossId); if (!boss) { detailContent.innerHTML = '
请选择一个BOSS查看详细信息
'; return; } else if(!boss.atks||boss.atks.length==0) { detailContent.innerHTML = `
请添加针对【${boss.bossName}】的方案
` if(click){ //--填充详情 bossHealthInput.value = ''; equipmentPlanSelect.selectedIndex = 0; bossNameInput.value = boss.bossName || ''; changeCondition(1) } return; }else { bossNameInput.value = boss.bossName || ''; detailContent.innerHTML = '' } const r = UserData() // 添加新选项 let countData=1 boss.atks.forEach(bossatk => { const li = document.createElement('div'); let htmlstr ='此条目为空,删了吧!'; li.className = 'boss-item'; li.dataset.id = countData; if (countData === selectedChildId) { li.classList.add('selected'); } if(bossatk){ li.dataset.id = bossatk.id; htmlstr = isNumeric(bossatk.hp) ? `当血量高于' : 'equipped">低于'}${bossatk.hp}%时,使用${r?r.equippedRoutineList[bossatk.planId-1].name:bossatk.planName}套装。` : `若出现${bossatk.hp}词条时,使用${r?r.equippedRoutineList[bossatk.planId-1].name:bossatk.planName}套装。`; } li.innerHTML =`
${countData}、` + htmlstr + `
` li.addEventListener('click', (e) => { if (e.target.classList.contains('delete-child-btn')) return; selectBossChild(bossatk); }); countData++ detailContent.appendChild(li); }); // 绑定删除事件 document.querySelectorAll('.delete-child-btn').forEach(btn => { btn.addEventListener('click', (e) => { e.stopPropagation(); const id = parseInt(btn.dataset.id); deleteChild(id); }); }); } // 删除方案 function deleteBoss(id) { bossData = bossData.filter(boss => boss.id !== id); if (selectedBossId === id) { selectedBossId = null; } renderBossList(); renderDetail(); saveBossData(); } // 删除方案子项 function deleteChild(id) { const boss = bossData.find(item => item.id === selectedBossId); boss.atks = boss.atks.filter(bossatk => bossatk && bossatk.id !== id); if (selectedChildId === id) { selectedChildId = null; } if (boss.atks.length == 0) { if (selectedBossId === id) { selectedBossId = null; } } renderBossList(); renderDetail(); saveBossData(); clearForm(); } // 清空表单 function clearForm(isall) { bossHealthInput.value = ''; equipmentPlanSelect.selectedIndex = 0; if (isall) { bossNameInput.value = ''; } } // 保存数据到 localStorage function saveBossData() { localStorage.setItem(savekey+'bossData', JSON.stringify(bossData)); } // 从 localStorage 加载数据 function loadBossData() { const savedData = localStorage.getItem(savekey+'bossData'); if (savedData) { bossData = JSON.parse(savedData); } if(bossData.length==0){ bossData = [{ bossName : "通用", // 记录name atks : [] // 记录name}] }] } //---加载完成后更新列表 renderBossList(); } //---------------------------------换装执行 let selectElement let isMonsterPK=false // 或通过文本内容选择 // simulateElementSelect(selectElement, "选项文本"); // 监听DOM变化的核心函数 let progressBars; const observeProgressBar = () => { let str=checkType==1?'tab-advance':'tab-normal'; // 定位目标容器 const progressContainer = document.querySelector(`div#pane-advance[aria-labelledby="${str}"]`); if (progressContainer) { // 查找所有进度条(ElementUI标准组件) progressBars = progressContainer.querySelector('.el-progress.el-progress--line'); // 自定义进度条可能需替换为其他选择器,如.progress-bar setInterval(() => { !isMonsterPK && listenerPro(progressBars,1); }, 1000); }else{ setTimeout(observeProgressBar,5000) } }; //对战血量监控 let pkprogressBar let viewp=null; let msgBox=null; let interval=null; let bosstitle=null; let tempData=[] const observerMonsterBar = () => { viewp =document.querySelector('.team-fight') if(viewp){ //---样式变化监听 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'style') { const isVisible = viewp.style.display !== 'none'; if (isVisible) { // 触发函数A console.log('触发函数A',bosstitle.innerText) tempData=[] if(pkprogressBar&&bossData.length>0){ const rm = UserData(); interval= setInterval(() => { // if(p==2){ //---找到名称 if(tempData.length==0){ const bossName=bosstitle.innerText bossData.forEach(item=>{ if(bossName.includes(item.bossName)){ tempData=item.atks } }); //console.log(currentValue) if(!tempData||tempData.length==0){ tempData=bossData[0].atks } tempData.forEach(td=>{td.isuse=false}); }else{ listenerPro(pkprogressBar,2,msgBox,rm); } /* } else{ tempData=publicData }*/ }, 500); } } else { console.log('触发函数B') clearInterval(interval); // 触发函数B } } }); }); observer.observe(viewp, { attributes: true, attributeFilter: ['style'] }); bosstitle = viewp.querySelector('h2'); pkprogressBar=viewp.querySelector('.el-progress.el-progress--line.is-exception') msgBox = document.getElementById('teamMessageBox') }else{ setTimeout(observerMonsterBar,5000) } } const checkAtk = function(selectEl,option, delay = 200) { if (!selectEl) { console.error('下拉菜单元素未找到'); return; } // 1. 触发下拉菜单展开 const wrapper = selectEl.querySelector('.el-select__wrapper'); if (wrapper) { // 创建并触发鼠标事件 const mouseDown = new MouseEvent('mousedown', { bubbles: true }); const mouseUp = new MouseEvent('mouseup', { bubbles: true }); wrapper.dispatchEvent(mouseDown); wrapper.dispatchEvent(mouseUp); // 2. 延迟处理选项选择 setTimeout(() => { // 获取下拉菜单实例(Vue组件实例) const vueInstance = selectEl.__vue__; // 方式一:通过Vue实例直接设置值(最优方案) if (vueInstance && vueInstance.setSelected) { if (typeof option === 'number') { vueInstance.setSelected(vueInstance.options[option]); } else { const target = vueInstance.options.find(opt => opt.label === option || opt.value === option ); target && vueInstance.setSelected(target); } return; } // 方式二:DOM操作备选方案 const dropdown = document.querySelector('.el-select-dropdown'); if (!dropdown) { console.error('下拉选项面板未找到'); return; } const options = dropdown.querySelectorAll('.el-select-dropdown__item'); let targetOption; if (typeof option === 'number') { targetOption = options[option]; } else { targetOption = [...options].find(opt => opt.textContent.trim() === option.trim() ); } if (targetOption) { // 创建并触发点击事件 const clickEvent = new MouseEvent('click', { bubbles: true }); targetOption.dispatchEvent(clickEvent); } else { console.error('未找到匹配的选项'); } }, delay); } }; let hpcount_2=0 let tempHP=0 const listenerPro=function(progressBar,p,msgbox,r){ if(progressBar){ if(!selectElement){ selectElement = document.querySelector('.el-select.el-select--small'); } let currentValue = 0; try{ currentValue = Number(progressBar.getAttribute('aria-valuenow'))}catch(e){} if(currentValue==0){ isMonsterPK = false return } let lastStr='' let lastDiv=null; if (msgbox && msgbox.lastElementChild) { lastDiv = msgbox.lastElementChild; lastStr = lastDiv.textContent || lastDiv.innerText || ''; } /* { id: Date.now(), hp: hp || '未设置', isLarge: isLarge, bossName: name, planId: planId, // 记录ID planName: planName // 记录name } */ //console.log('当前词条:', lastStr); for(let i1=0;i1item.hp:currentValue { //observeProgressBar(); observerMonsterBar(); }); })();