// ==UserScript== // @name 装备管理 // @namespace http://tampermonkey.net/ // @version 2026-03-11 // @description 别问这是什么 // @author 生猛的程序 // @match https://aring.cc/awakening-of-war-soul-ol/ // @icon https://www.google.com/s2/favicons?sz=64&domain=aliyuncs.com // @grant none // ==/UserScript== (function() { 'use strict'; let jsPath='' let isStart=true let fitterCD=65 const htmlStr={ divstr:`
`, lcukHtml:`` } //🔒 let btnstksp,btncrt,btnheat let labstksp,labcrt,labheat let btnlock,lockviews let isAutoLock=false let baseData=[] //---装备数据--原始 let baseListData=[] //---装备数据--筛选 let special=[] //--筛选词条 let quality=[] //--装备等级 let equiptype=[] //--装备类型 let lastTime = 0; const wait =200; let buttons; let clickfillertype=-1 //--排序条件 let countText; let darkGoldBtn; function fullView(){ const viewparent=document.querySelector('.item-page') if(viewparent){ const childParent=viewparent.querySelector('.action'); if(childParent){ countText=childParent.querySelector('span').querySelector('span'); const pageview=childParent.querySelector('.item-filter-wrap'); if(pageview){ const oldbuttons = pageview.querySelectorAll('button'); oldbuttons.forEach(button=>{ // 创建MutationObserver监听样式变化 if(button.innerText==='重置'){ if(!isStart){ return } // 添加点击事件(可选) button.addEventListener('click', () => { clickfillertype=-1; special=[]; quality=[] //--装备等级 equiptype=[] //--装备类型 //baseListData=baseData; // 方式2:更易读的多行写法 if (btnstksp) { btnstksp.style='margin-top: 10px;'; labstksp.classList.remove('unique'); } if (btncrt) { btncrt.style='margin-top: 10px;'; labcrt.classList.remove('unique'); } if (btnheat) { btnheat.style='margin-top: 10px;'; labheat.classList.remove('unique'); } buttons.forEach(button => { if(button.id){ const labBtn=document.getElementById(`lab${button.id}`) button.style='margin-top: 10px;' labBtn && labBtn.classList.remove('legend') } }); setTimeout(sortItemsByAtksp, 100); console.log('重置按钮被点击'); }); } if(button.innerText==='暗金'){ darkGoldBtn=button } const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'style') { const currentStyle = button.getAttribute('style') || ''; const hasRedBorder = currentStyle.includes('border-color: red'); // 触发自定义事件 const event = new CustomEvent('borderColorChange', { detail: { hasRedBorder: hasRedBorder, element: button } }); button.dispatchEvent(event); } }); }); // 开始观察 observer.observe(button, { attributes: true, attributeFilter: ['style'] }); // 添加事件监听器 button.addEventListener('borderColorChange', (e) => { //--先确认ID是否为排序相关 const now = Date.now(); console.log('颜色变化事件'); if (now - lastTime >= wait) { if (e.detail.hasRedBorder) { console.log('按钮边框变为红色:', e.detail.element.id); // 在这里添加边框变红时的处理逻辑 } else { console.log('按钮边框红色消失:', e.detail.element.id); // 在这里添加边框红色消失时的处理逻辑 } lastTime = now; //baseListData=[]; filterType(e.detail.element) //setTimeout(, 100); } }); }); // 创建新元素 const newElement = document.createElement(`div`); //newElement.className = 'common-btn-wrap'; newElement.setAttribute(childParent.attributes[0].name, ''); // newElement.setAttribute(`style`,"grid-column: span 3;width:100%;") newElement.innerHTML = htmlStr.divstr; // 添加点击事件(可选) //pageview.appendChild(8,newElement); pageview.insertBefore(newElement, pageview.children[9]); // 为所有子元素设置属性 const allChildren = newElement.querySelectorAll('*'); allChildren.forEach(child => { child.setAttribute(childParent.attributes[0].name, ''); }); // 监听button元素的样式变化 buttons = newElement.querySelectorAll('button'); buttons.forEach(button => { const btnID=button.id let clicktype=-1; switch(btnID){ case 'btnstksp': !btnstksp && (btnstksp=button,labstksp=document.getElementById('labstksp')) clicktype=0 break case 'btncrt': !btncrt && (btncrt=button,labcrt=document.getElementById('labcrt')) clicktype=1 break case 'btnheat': !btnheat && (btnheat=button,labheat=document.getElementById('labheat')) clicktype=2 break } // if(clicktype>=0){ button.addEventListener('click', (e) => { if(clicktype==-1){ //const btn = e.target; // 获取被点击的按钮 //const bID=btn.id; const labBtn=document.getElementById(`lab${btnID}`) const isHave=special.find(item=>item===btnID) if(isHave){ special = special.filter(item => item !== btnID); button.style='margin-top: 10px;' labBtn.classList.remove('legend') }else{ special.push(btnID) button.style="margin-top: 10px;border-color: red;" labBtn.classList.add('legend') } if(special&&special.length>0&&!checkBtnClick(darkGoldBtn)){ //---有自定义筛选内容,且没有选择暗金类型,手动点击暗金 darkGoldBtn.click() } }else{ ( btnstksp && (btnstksp.style='margin-top: 10px;',labstksp.classList.remove('unique')), btncrt && (btncrt.style='margin-top: 10px;',labcrt.classList.remove('unique')), btnheat && (btnheat.style='margin-top: 10px;',labheat.classList.remove('unique'))) switch(btnID){ case 'btnstksp': clickfillertype=0 // btnstksp.+="border-color: red;" btnstksp.style="margin-top: 10px;border-color: red;" labstksp.classList.add('unique') //!btnstksp && (btnstksp=e.detail.element) // clicktype=0 break case 'btncrt': clickfillertype=1 labcrt.classList.add('unique') btncrt.style="margin-top: 10px;border-color: red;" // !btncrt && (btncrt=e.detail.element) // clicktype=1 break case 'btnheat': clickfillertype=2 labheat.classList.add('unique') btnheat.style="margin-top: 10px;border-color: red;" // !btnheat && (btnheat=e.detail.element) // clicktype=2 break } } sortItemsByAtksp() }); // } }); } // 创建新元素 const newElement = document.createElement(`span`); /* newElement.setAttribute('aria-disabled', 'true'); newElement.setAttribute('type', 'button'); newElement.setAttribute('class', 'el-button el-button--success el-button--small is-plain normal'); newElement.setAttribute(childParent.attributes[0].name, ''); */ newElement.setAttribute(`style`,"margin-left: 12px;") newElement.setAttribute('class', 'equip-lock'); newElement.innerHTML = htmlStr.lcukHtml; btnlock=newElement.querySelector('button'); lockviews=newElement.querySelectorAll('.el-icon') // 添加点击事件(可选) newElement.addEventListener('click', () => { // console.log('新按钮被点击',T); if(isAutoLock){ //---解锁 btnlock.classList.remove('el-button--success'); btnlock.classList.add('el-button--info'); lockviews[0].style='font-size: 15px;' lockviews[1].style='font-size: 15px; display: none;' }else{ //---加锁 btnlock.classList.add('el-button--success'); btnlock.classList.remove('el-button--info'); lockviews[1].style='font-size: 15px;' lockviews[0].style='font-size: 15px; display: none;' setTimeout(LockItemsByAtksp, 2000); } isAutoLock=!isAutoLock }); //pageview.appendChild(8,newElement);// 正确用法 childParent.insertBefore(newElement, childParent.children[childParent.children.length - 1]); } } const htmlconet=document.create } function checkBtnClick(button){ const currentStyle = button.getAttribute('style') || ''; const hasRedBorder = currentStyle.includes('border-color: red'); return hasRedBorder } setTimeout(fullView, 2000); //---查找挂载JS 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; loadData() return // console.log('找到目标文件:', src); } }); console.log('文件筛选完毕:'); } setTimeout(findIndexJS, 2000); const On = { normal: "普通", race: "稀有", epic: "史诗", unique: "独特", legend: "传说", antiquity: "远古", peerless: "绝世", darkGold: "暗金", myth: "神话暗金" } function matchKeyByText(text) { return Object.keys(On).find(key => On[key] === text) ||null; } function filterType(btnV){ const cn=btnV.innerText; if(cn){ const isHaveNT= matchKeyByText(cn) if(isHaveNT){ const isHave=quality.find(item=>item===isHaveNT) if(isHave){ quality = quality.filter(item => item !== isHaveNT); }else{ quality.push(isHaveNT) } }else { let ztype='' switch(cn){ case '🔪': ztype='weapon' break case '🧢': ztype='helmet' break case '🥋': ztype='armor' break case '🥾': ztype='shoes' break case '💍': ztype='jewelry' break } const isHave=equiptype.find(item=>item===ztype) if(isHave){ equiptype = equiptype.filter(item => item !== ztype); }else{ equiptype.push(ztype) } } sortItemsByAtksp() } } let UserData let UserRE function loadData(isOrivade){ if(!jsPath){ return; } if(!UserData||isOrivade){ const getModuleExports = async () => { try { const module = await import(jsPath); // 替换为实际路径 const data={}; data.userD=module.u; data.userB=module.b; return data; } catch (e) { console.error('模块加载失败:', e); } } getModuleExports().then(tool => { tool && (UserData=tool.userD,UserRE=tool.userB,initData(),checkRE()); }); } } function checkRE(){ if(UserRE&&Object.keys(te(UserRE)).length > 0){ return; } console.log('装备数据详情'); setTimeout(()=>{ loadData(true)}, 2000); } function d(t) { return !!(t && t.__v_isRef === !0) } function te(t) { return d(t) ? t.value : t } function checkLogin(){ // 获取目标元素 const element = document.querySelector('.start-page'); let isVisible = false if (element) { // 判断显示状态的三种方法(任选其一) isVisible = // 方法1:通过计算样式检查 window.getComputedStyle(element).display !== 'none' || // 方法2:通过偏移量检查(更全面) (element.offsetWidth > 0 || element.offsetHeight > 0) || // 方法3:通过可见性检查 element.getClientRects().length > 0; console.log('元素显示状态:', isVisible); } else { isVisible=true; console.error('未找到 class="start-page" 的元素'); } return isVisible } function initData(){ if(UserData){ const r=UserData() /* console.log('当前背包装备数量(可能含装备栏):'+r.itemList.length); */ //--初始化装备类型 r.itemList.forEach(item=>{ item.quality=item.quality.replace('custom',''); }); //const jsonstr=JSON.stringify(r.itemList) baseListData=r.itemList; } } function deepCopyArray(arr) { return arr.map(item => { if (Array.isArray(item)) { return deepCopyArray(item); } else if (typeof item === 'object' && item !== null) { return { ...item }; } else { return item; } }); } function sortItemsByAtksp() { if(UserData){ const r=UserData(); initData(); /* const listItem1=[],listItem2=[]; if(isStart){ //---筛选类型 UserRE listItem1 =baseListData.filter(item=>{ return equiptype.length>0?equiptype.find(it=>te(UserRE)[item.equipId].type===it):true; }) //---筛选阶级 listItem2=listItem1.filter(item=>{ return quality.length>0?quality.find(it=>item.quality===it):true; }) }else{ listItem2=baseListData } */ const equippedList=[] //console.log(`当前装备套路:${r.equippedRoutineList.find(eq=>eq.id==r.equippedRoutineId).name} `); for (const [key, value] of Object.entries(r.equippedList)) { //console.log(`装备类型: ${key}, ID: ${value}`); equippedList.push(value); } //---找到不满足条件的 let filterData =[]; if(special.length>0){ filterData= baseListData.filter(item=>{ if(checkEquipped(equippedList,item.id)){ console.log('你应该要进来5次'); return false } try{ //--先筛选装备类型,后筛选装备词条 并且他们是同时满足 return !((checkEquippedType(item) && special.find(kv=>kv===item.darkGoldAttrs.special[0].key || kv===item.engraveAttr.special[0].key ) )|| !isStart); }catch(e){ return true } }); } filterData.forEach(item=>{ item.quality=item.quality+'custom'; }); const newList=clickfillertype>=0 ? baseListData.sort((a, b) => { const atkspA = getAtksp(a,clickfillertype) || 0; const atkspB = getAtksp(b,clickfillertype) || 0; return atkspB - atkspA; // 降序排序 }):baseListData; r.itemList=newList let count=r.itemList.length-5-filterData.length countText && (countText.innerText=count+'') console.log('筛选后的装备条目数:',count ); }else{ loadData() } } function checkEquipped(equippedList,equipid){ let isHave=false; equippedList.forEach(ql=> { if(ql===equipid){ isHave = true; } }); return isHave; } function checkEquippedType(item){ //---再筛选下类型 return equiptype.length>0?equiptype.find(it=>te(UserRE)[item.equipId].type===it):true; } let tl={ "thump": { "multiplier": 1.2 }, "harvest": { "multiplier": 1.75 }, "assault": { "multiplier": 1.75 }, "chasing": { "value": 1.6 }, "heavyInjury": { "value": 2.4 }, "break": { "multiplier": 0.5 }, "crushBone": { "value": 3, "multiplier": 1.3 }, "burst": { "rate": 0.75 }, "nothingness": { "multiplier": 0.6 }, "split": { "rate": 1.5 }, "cruel": { "value": 2.4, "multiplier": 1 }, "shadowBlade": { "value": 0.95, "multiplier": 0.25 }, "swiftness": { "value": 0.02 }, "precise": { "multiplier": 1.4 }, "rout": { "value": 0.75, "multiplier": 1.5 }, "tearInjury": { "value": 1.45 }, "impact": { "value": 5, "multiplier": 2.3 }, "windUp": { "value": 5, "multiplier": 2.3 } } function getAtksp(item,typec) { let findstr='atksp' switch(typec){ case 0: findstr='atksp'; break case 1: findstr='crt'; break case 2: findstr='heat'; break } const darkGoldAttrs = item.darkGoldAttrs || {}; const basicAttrs = darkGoldAttrs.basic || []; if(typec>=0){ const crtdEntry = basicAttrs.find(attr => attr[0] === findstr); return sumAttributes(basicAttrs,findstr) }else{ //----加锁--暗金属性满分 const crtdValue = basicAttrs.find(attr => attr[1] === 10); (crtdValue||hasSpecialValueGreaterThan5(item)) && (item.isLock =true); } } function sumAttributes(basicAttrs, findstr) { return basicAttrs.reduce((sum, attr) => { if (attr[0] === findstr) { return sum + attr[1]; } return sum; }, 0); } //暗金词条纯度高于50 function hasSpecialValueGreaterThan5(item) { const special = item.darkGoldAttrs?.special || []; return special.find(attr=>{ const { key: c, data: _ } = attr,w = Object.keys(tl[c]), m = (_[w[0]] || _[w[1]]) * 10; return m>=fitterCD }); /* for (const attr of special) { const data = attr.data || {}; for (const key in data) { if (typeof data[key] === 'number' && data[key] > 5) { return true; } } } return false;*/ } //----加锁 function LockItemsByAtksp() { if(UserData){ const r=UserData(); r.itemList.map(item=>getAtksp(item,-1)); }else{ loadData() } isAutoLock&&(setTimeout(LockItemsByAtksp, 2000)); } })();