修复了小镇提示的部分bug

This commit is contained in:
woohoo 2021-12-24 15:45:21 +08:00
parent dcefc6b164
commit 57894c2a42

View File

@ -1,8 +1,8 @@
// ==UserScript== // ==UserScript==
// @lastmodified 202112232309 // @lastmodified 202112241544
// @name Torn翻译 // @name Torn翻译
// @namespace WOOH // @namespace WOOH
// @version 0.1.1223a // @version 0.1.1224a
// @description Torn UI翻译 // @description Torn UI翻译
// @author Woohoo-[2687093] sabrina_devil[2696209] // @author Woohoo-[2687093] sabrina_devil[2696209]
// @match https://www.torn.com/* // @match https://www.torn.com/*
@ -23,6 +23,11 @@
todo: true, todo: true,
cont: `baza npc商店 imarket及imarket搜索结果`, cont: `baza npc商店 imarket及imarket搜索结果`,
}, },
{
ver: '0.1.1224a',
date: '20211224',
cont: `修复了小镇提示的部分bug`,
},
{ {
ver: '0.1.1223a', ver: '0.1.1223a',
date: '20211223', date: '20211223',
@ -5473,27 +5478,32 @@ margin: 0 0 3px;
const chestTypeColorDict = {'1': 'gold', '2': 'silver', '3': 'sandybrown',}; const chestTypeColorDict = {'1': 'gold', '2': 'silver', '3': 'sandybrown',};
const lootTypeDict = {'chests': '钥匙箱', 'gifts': '礼物', 'combinationChest': '密码箱', 'keys': '钥匙',}; const lootTypeDict = {'chests': '钥匙箱', 'gifts': '礼物', 'combinationChest': '密码箱', 'keys': '钥匙',};
const keyTypeDict = {'b': '铜', 's': '银', 'g': '金',}; const keyTypeDict = {'b': '铜', 's': '银', 'g': '金',};
const dropHist = localStorage.getItem('wh-loot-store') let dropHist = localStorage.getItem('wh-loot-store')
? JSON.parse(localStorage.getItem('wh-loot-store')) ? JSON.parse(localStorage.getItem('wh-loot-store'))
: {}; : {};
const alertSettings = localStorage.getItem('wh-loot-setting') const alertSettings = localStorage.getItem('wh-loot-setting')
? JSON.parse(localStorage.getItem('wh-loot-setting')) ? JSON.parse(localStorage.getItem('wh-loot-setting'))
: {blink: 'y', sound: 'y'}; : {blink: 'y', sound: 'y', chest: 'y'};
let onClickBind = false; let $ct_wrap;
const getDOMOb = new MutationObserver(() => {
const intervalID = window.setInterval(() => { $ct_wrap = $root.querySelector('#ct-wrap');
const $city_wrapper = $root.querySelector('#ct-wrap'); if ($ct_wrap) {
if ($city_wrapper) { getDOMOb.disconnect();
const $ct_title = $city_wrapper.querySelector('.status-title'); ob.observe($ct_wrap, {childList: true, subtree: true});
const $pos = $city_wrapper.querySelector('.map-title span[class^="position___"]') || $city_wrapper.querySelector('.status-title span[class^="position___"]'); }
if (!$pos) return; });
const $pos_spl = $pos.innerText.trim().split(','); const ob = new MutationObserver(() => {
const player_position = {}; // if ($ct_wrap) {
player_position.x = parseInt($pos_spl[0]); const $ct_title = $ct_wrap.querySelector('.status-title');
player_position.y = parseInt($pos_spl[1]); const $pos = $ct_wrap.querySelector('.map-title span[class^="position___"]') || $ct_wrap.querySelector('.status-title span[class^="position___"]');
let $wh_loot_container = $root.querySelector('#wh-loot-container'); if (!$pos) return;
if (!$wh_loot_container) { const $pos_spl = $pos.innerText.trim().split(',');
const insert_html = `<div id="wh-loot-container" class="m-bottom10"> const player_position = {};
player_position.x = parseInt($pos_spl[0]);
player_position.y = parseInt($pos_spl[1]);
let $wh_loot_container = $root.querySelector('#wh-loot-container');
if (!$wh_loot_container) {
const insert_html = `<div id="wh-loot-container" class="m-bottom10">
<audio src="https://www.torn.com/js/chat/sounds/Chirp_3.mp3" style="display:none"></audio> <audio src="https://www.torn.com/js/chat/sounds/Chirp_3.mp3" style="display:none"></audio>
<div class="title-black"><span>附近物品</span></div> <div class="title-black"><span>附近物品</span></div>
<div id="wh-loot-container-main" class="cont-gray"> <div id="wh-loot-container-main" class="cont-gray">
@ -5505,8 +5515,12 @@ margin: 0 0 3px;
<div id="wh-loot-container-ex" class="cont-gray wh-hide"> <div id="wh-loot-container-ex" class="cont-gray wh-hide">
<div><input type="checkbox" id="wh-loot-setting-blink" ${alertSettings.blink === 'y' ? 'checked' : ''} /><label for="wh-loot-setting-blink">闪烁提示</label></div> <div><input type="checkbox" id="wh-loot-setting-blink" ${alertSettings.blink === 'y' ? 'checked' : ''} /><label for="wh-loot-setting-blink">闪烁提示</label></div>
<div><input type="checkbox" id="wh-loot-setting-sound" ${alertSettings.sound === 'y' ? 'checked' : ''} /><label for="wh-loot-setting-sound">声音提示(不支持iOS)</label></div> <div><input type="checkbox" id="wh-loot-setting-sound" ${alertSettings.sound === 'y' ? 'checked' : ''} /><label for="wh-loot-setting-sound">声音提示(不支持iOS)</label></div>
<div><input type="checkbox" id="wh-loot-setting-chest" ${alertSettings.chest === 'y' ? 'checked' : ''} /><label for="wh-loot-setting-chest">不记录需要钥匙的宝箱</label></div>
<div> <div>
<table><thead><tr><th colspan="5">历史记录</th></tr><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody></tbody></table> <div id="wh-hist-clear">
<p><button>清空数据</button>- bug</p>
</div>
<table><thead><tr><th colspan="5">历史记录</th></tr><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody></tbody></table>
</div> </div>
</div> </div>
<div id="wh-loot-btn" class="cont-gray"><button>设置</button></div> <div id="wh-loot-btn" class="cont-gray"><button>设置</button></div>
@ -5539,71 +5553,82 @@ margin: 0 0 3px;
100% {background: #f2f2f2} 100% {background: #f2f2f2}
} }
</style>`; </style>`;
$($city_wrapper).before(insert_html); $($ct_wrap).before(insert_html);
$wh_loot_container = $root.querySelector('#wh-loot-container'); $wh_loot_container = $root.querySelector('#wh-loot-container');
}
const $audio = $wh_loot_container.querySelector('audio');
const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink');
alertSettings.blink = $blink.checked ? 'y' : 'n';
const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound');
alertSettings.sound = $sound.checked ? 'y' : 'n';
const $chest = $wh_loot_container.querySelector('#wh-loot-setting-chest');
alertSettings.chest = $chest.checked ? 'y' : 'n';
const $ex = $wh_loot_container.querySelector('#wh-loot-container-ex');
const $btn = $wh_loot_container.querySelector('#wh-loot-btn button');
const $clear_btn = $wh_loot_container.querySelector('#wh-hist-clear button');
const $tbody = $wh_loot_container.querySelector('tbody');
if ($btn.onclick === null) $btn.onclick = (e) => {
e.target.innerText = e.target.innerText === '设置' ? '收起' : '设置';
$($ex).toggleClass('wh-hide');
e.target.blur();
};
if ($clear_btn.onclick === null) $clear_btn.onclick = (e) => {
dropHist = {};
$tbody.innerHTML = '';
e.target.blur();
};
const nearby_arr = [];
const items = $root.querySelectorAll('div.grid-layer div.items-layer div.ct-item');
// 附近的所有物品
items.forEach(el => {
const item_props = {x: 0, y: 0, name: '', type: '', url: '',};
item_props.x = parseInt(el.style.left.replaceAll('px', '')) / 30;
item_props.y = -parseInt(el.style.top.replaceAll('px', '')) / 30;
item_props.url = el.firstElementChild.src;
const srcSpl = item_props.url.trim().split('/');
item_props.name = srcSpl[6];
item_props.type = srcSpl[8].slice(0, 1);
nearby_arr.push(item_props);
});
const $wh_loot_container_items = $wh_loot_container.querySelector('#wh-loot-container-items');
const $wh_loot_container_chests = $wh_loot_container.querySelector('#wh-loot-container-chests');
let item_count = 0, chest_count = 0;
$wh_loot_container_items.innerHTML = '';
$wh_loot_container_chests.innerHTML = '';
nearby_arr.forEach(nearby_item => {
let path = '=';
if (nearby_item.x < player_position.x && nearby_item.y < player_position.y) path = '↙';
else if (nearby_item.x < player_position.x && nearby_item.y === player_position.y) path = '←';
else if (nearby_item.x < player_position.x && nearby_item.y > player_position.y) path = '↖';
else if (nearby_item.x === player_position.x && nearby_item.y > player_position.y) path = '↑';
else if (nearby_item.x > player_position.x && nearby_item.y > player_position.y) path = '↗';
else if (nearby_item.x > player_position.x && nearby_item.y === player_position.y) path = '→';
else if (nearby_item.x > player_position.x && nearby_item.y < player_position.y) path = '↘';
else if (nearby_item.x === player_position.x && nearby_item.y < player_position.y) path = '↓';
let isChest = false;
let item_name;
if (nearby_item.name === 'chests') {
chest_count++;
isChest = true;
item_name = chestTypeDict[nearby_item.type] + lootTypeDict[nearby_item.name];
$wh_loot_container_chests.innerHTML += `<span style="background-color: ${chestTypeColorDict[nearby_item.type] || 'silver'};">${path}[${nearby_item.x},${nearby_item.y}] ${item_name}<img src="${nearby_item.url}" /></span>`
} else {
item_count++;
item_name = (nearby_item.name === 'keys' ? keyTypeDict[nearby_item.type] || '' : '') + lootTypeDict[nearby_item.name] || nearby_item.name;
$wh_loot_container_items.innerHTML += `<span>${path}[${nearby_item.x},${nearby_item.y}] ${item_name}<img src="${nearby_item.url}" /></span>`
} }
const $audio = $wh_loot_container.querySelector('audio'); // 确认地图坐标存在
const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink'); if ($ct_title) {
alertSettings.blink = $blink.checked ? 'y' : 'n'; const hist_key = `[${nearby_item.x},${nearby_item.y}]"${$ct_title.firstChild.nodeValue.trim()}"${item_name}`;
const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound'); const el = dropHist[hist_key];
alertSettings.sound = $sound.checked ? 'y' : 'n'; if (el) {
const $ex = $wh_loot_container.querySelector('#wh-loot-container-ex'); if (path === '=' && (nearby_item.name === 'keys' || nearby_item.name === 'gifts')) {
const $btn = $wh_loot_container.querySelector('#wh-loot-btn button'); el.isPassed = true;
const $tbody = $wh_loot_container.querySelector('tbody'); }
if (!onClickBind) $btn.onclick = (e) => {
e.target.innerText = e.target.innerText === '设置' ? '收起' : '设置';
$($ex).toggleClass('wh-hide');
onClickBind = true;
e.target.blur();
};
const nearby_arr = [];
const items = $root.querySelectorAll('div.grid-layer div.items-layer div.ct-item');
// 附近的所有物品
items.forEach(el => {
const item_props = {x: 0, y: 0, name: '', type: '', url: '',};
item_props.x = parseInt(el.style.left.replaceAll('px', '')) / 30;
item_props.y = -parseInt(el.style.top.replaceAll('px', '')) / 30;
item_props.url = el.firstElementChild.src;
const srcSpl = item_props.url.trim().split('/');
item_props.name = srcSpl[6];
item_props.type = srcSpl[8].slice(0, 1);
nearby_arr.push(item_props);
});
const $wh_loot_container_items = $wh_loot_container.querySelector('#wh-loot-container-items');
const $wh_loot_container_chests = $wh_loot_container.querySelector('#wh-loot-container-chests');
let item_count = 0, chest_count = 0;
$wh_loot_container_items.innerHTML = ``;
$wh_loot_container_chests.innerHTML = ``;
nearby_arr.forEach(nearby_item => {
let path = '=';
if (nearby_item.x < player_position.x && nearby_item.y < player_position.y) path = '↙';
else if (nearby_item.x < player_position.x && nearby_item.y === player_position.y) path = '←';
else if (nearby_item.x < player_position.x && nearby_item.y > player_position.y) path = '↖';
else if (nearby_item.x === player_position.x && nearby_item.y > player_position.y) path = '↑';
else if (nearby_item.x > player_position.x && nearby_item.y > player_position.y) path = '↗';
else if (nearby_item.x > player_position.x && nearby_item.y === player_position.y) path = '→';
else if (nearby_item.x > player_position.x && nearby_item.y < player_position.y) path = '↘';
else if (nearby_item.x === player_position.x && nearby_item.y < player_position.y) path = '↓';
let item_name;
if (nearby_item.name === 'chests') {
chest_count++;
item_name = chestTypeDict[nearby_item.type] + lootTypeDict[nearby_item.name];
$wh_loot_container_chests.innerHTML += `<span style="background-color: ${chestTypeColorDict[nearby_item.type] || 'silver'};">${path}[${nearby_item.x},${nearby_item.y}] ${item_name}<img src="${nearby_item.url}" /></span>`
} else { } else {
item_count++; // (() => {
item_name = (nearby_item.name === 'keys' ? keyTypeDict[nearby_item.type] || '' : '') + lootTypeDict[nearby_item.name] || nearby_item.name; if (!(isChest && $chest.checked)) {
$wh_loot_container_items.innerHTML += `<span>${path}[${nearby_item.x},${nearby_item.y}] ${item_name}<img src="${nearby_item.url}" /></span>` const now = new Date();
}
if ($ct_title) {
const now = new Date();
const hist_key = `[${nearby_item.x},${nearby_item.y}]"${$ct_title.firstChild.nodeValue.trim()}"`;
const el = dropHist[hist_key];
if (el) {
if (nearby_item.x === player_position.x && nearby_item.y === player_position.y && nearby_item.name !== ('chests' || 'combinationChest')) {
el.isPassed = true;
}
el.last = `${now.getFullYear()}-${now.getMonth()}-${now.getDay()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
} else {
dropHist[hist_key] = { dropHist[hist_key] = {
pos: `[${nearby_item.x},${nearby_item.y}]`, pos: `[${nearby_item.x},${nearby_item.y}]`,
map: $ct_title.firstChild.nodeValue.trim(), map: $ct_title.firstChild.nodeValue.trim(),
@ -5612,30 +5637,35 @@ margin: 0 0 3px;
id: Object.keys(dropHist).length, id: Object.keys(dropHist).length,
}; };
} }
// else {
// return;
// }
// })();
} }
});
$wh_loot_container.querySelector('#wh-loot-item-count').innerText = `(${item_count})`;
if (item_count === 0) {
$wh_loot_container_items.innerText = `暂无`;
$wh_loot_container.querySelector('#wh-loot-container-main').style.animation = '';
} else {
if ($blink.checked) $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite';
if ($sound.checked) $audio.play().then();
} }
$wh_loot_container.querySelector('#wh-loot-chest-count').innerText = `(${chest_count})`; });
if (chest_count === 0) $wh_loot_container_chests.innerText = `暂无`; $wh_loot_container.querySelector('#wh-loot-item-count').innerText = `(${item_count})`;
if (item_count === 0) {
const history = Object.keys(dropHist).map(key => dropHist[key]).sort((a, b) => a.id - b.id); $wh_loot_container_items.innerText = `暂无`;
let table_html = ``; $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = '';
history.forEach(e => { } else {
table_html += `<tr><td>${e.pos}</td><td>${e.map}</td><td>${e.name}</td><td>${e.last}</td><td>${e.isPassed ? '已取得' : '不确定'}</td></tr>`; if ($blink.checked) $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite';
}); if ($sound.checked) $audio.play().then();
$tbody.innerHTML = table_html;
localStorage.setItem('wh-loot-store', JSON.stringify(dropHist));
localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings));
} }
}, 1200); $wh_loot_container.querySelector('#wh-loot-chest-count').innerText = `(${chest_count})`;
if (chest_count === 0) $wh_loot_container_chests.innerText = `暂无`;
const history = Object.keys(dropHist).map(key => dropHist[key]).sort((a, b) => a.id - b.id);
let table_html = '';
history.forEach(e => {
table_html += `<tr><td>${e.pos}</td><td>${e.map}</td><td>${e.name}</td><td>${e.last}</td><td>${e.isPassed ? '已取得' : '不确定'}</td></tr>`;
});
$tbody.innerHTML = table_html;
localStorage.setItem('wh-loot-store', JSON.stringify(dropHist));
localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings));
});
getDOMOb.observe($root, {childList: true, subtree: true})
return; return;
} }