您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Finding items in towns for The West Classic
// ==UserScript== // @name TW Trader // @namespace Johnny // @author Johnny // @version 1.1 // @description Finding items in towns for The West Classic // @match https://classic.the-west.net/game.php* // @grant none // ==/UserScript== window.TWTrader = { towns: {}, items: [], buildings: ['tailor', 'gunsmith', 'general'], windowName: 'TWTrader', init: function() { let val = setInterval(function() { if (Object.keys(WMap.mapData.towns.obj).length !== 0) { clearInterval(val); TWTrader.getData(); TWTrader.addMenuButton(); } }, 500); }, addMenuButton: function() { let button = document.createElement('li'); button.id = 'menu_quests_plus'; let buttonLink = document.createElement('a'); buttonLink.onclick = TWTrader.openWindow; buttonLink.innerHTML = '<span>Quests+</span>'; buttonLink.style.cursor = 'pointer'; buttonLink.style.background = 'url("data:image/png;base64,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")'; button.appendChild(buttonLink); document.getElementById('right_menu').appendChild(button); }, openWindow: function() { if (!AjaxWindow.windows[TWTrader.windowName]) { let win = new Element('div', { 'id': 'window_' + TWTrader.windowName, 'class': 'window' }); AjaxWindow.windows[TWTrader.windowName] = win; let html = '\ <div class="window_borders"> \ <h2 id="window_' + TWTrader.windowName + '_title" class="window_title"><span>Quests+</span></h2> \ <a href="javascript:AjaxWindow.closeAll();" class="window_closeall"></a><a href="javascript:AjaxWindow.toggleSize(\'' + TWTrader.windowName + '\');" class="window_minimize"></a><a href="javascript:AjaxWindow.close(\'' + TWTrader.windowName + '\');" class="window_close"></a> \ <div id="window_' + TWTrader.windowName + '_content" class="window_content"></div> \ </div> \ '; win.setHTML(html); win.bringToTop(); win.injectInside('windows'); win.centerLeft(); let win_title = $('window_' + TWTrader.windowName + '_title'); win_title.addEvent('dblclick', function () { win.centerLeft(); win.setStyle('top', 133); }); win.makeDraggable({ handle: win_title, onStart: function () { }, onComplete: function () { }.bind(AjaxWindow) }); win.addEvent('mousedown', win.bringToTop.bind(win, [])); win_title.addEvent('mousedown', win.bringToTop.bind(win, [])); let win_content = $('window_' + TWTrader.windowName + '_content'); win_content.style.overflowY = 'auto'; TWTrader.clear(win_content); win_content.appendChild(TWTrader.getItems()); } else { AjaxWindow.maximize(TWTrader.windowName); AjaxWindow.windows[TWTrader.windowName].bringToTop(); } }, getItems: function() { let wrap = document.createElement('div'); wrap.style.textAlign = 'center'; let towns_div = document.createElement('div'); towns_div.id = TWTrader.windowName + '_towns'; towns_div.style.marginBottom = '10px'; wrap.appendChild(towns_div); for (let item of TWTrader.items) { if (item) { let item_div = new Item(item, true).get_bag_el(); item_div.style.cursor = 'pointer'; item_div.style.float = 'none'; item_div.style.display = 'inline-block'; item_div.addEventListener('click', function() { TWTrader.renderTowns(item.towns); }, false); wrap.appendChild(item_div); } } return wrap; }, renderTowns: function(towns) { let sortedTowns = []; for (let town of towns) { sortedTowns.push({ id: town, name: TWTrader.towns[town].name, way_time: TWTrader.towns[town].way_time }); } sortedTowns.sort(function(a, b) { return a.way_time - b.way_time; }); let towns_div = document.getElementById(TWTrader.windowName + '_towns'); TWTrader.clear(towns_div); for (let town of sortedTowns) { let town_div = document.createElement('div'); town_div.className = 'questlog_header'; town_div.style.width = 'auto'; town_div.style.margin = '0 0 -1px'; town_div.innerHTML = '<a href="javascript:AjaxWindow.show(\'town\',{town_id:' + town.id + '});">' + town.name + '</a> (distance: ' + town.way_time.formatDuration() + ')'; towns_div.appendChild(town_div); } }, getData: function() { WMap.mapData.towns.each(function(town) { if (town.town) { let way_time = WMap.calcWayTime(Tasks.last_pos, town); TWTrader.towns[town.town.town_id] = { name: town.town.name, way_time: way_time }; let townId = town.town.town_id; for (let i = 0; i < TWTrader.buildings.length; i++) { let xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status == 200) { let data = JSON.parse(xhr.responseText || '{}'); if (data.js && data.page) { let townStart = data.page.indexOf('town_id: ') + 9; let townStr = data.page.substring(townStart, data.page.indexOf('<', townStart)).split('});">'); let townId = townStr[0]; let itemsStart = data.js.indexOf('var trader_inv = ') + 17; let itemsStr = data.js.substring(itemsStart, data.js.indexOf('];', itemsStart) + 1); let items = JSON.parse(itemsStr); for (let i = 0; i < items.length; i++) { let itemId = items[i].item_id; if (!TWTrader.items[itemId]) { TWTrader.items[itemId] = items[i]; TWTrader.items[itemId].towns = [townId]; } else { TWTrader.items[itemId].towns.push(townId); } } } } }; xhr.open('POST', 'game.php?window=building_' + TWTrader.buildings[i] + '&town_id=' + townId, true); xhr.send(); } } }); }, clear: function(el) { while (el.firstChild) el.removeChild(el.firstChild); }, }; TWTrader.init();