mooket

银河奶牛历史价格(包含强化物品)history(enhancement included) price for milkywayidle

  1. // ==UserScript==
  2. // @name mooket
  3. // @namespace http://tampermonkey.net/
  4. // @version 20250427.4.7
  5. // @description 银河奶牛历史价格(包含强化物品)history(enhancement included) price for milkywayidle
  6. // @author IOMisaka
  7. // @match https://www.milkywayidle.com/*
  8. // @match https://test.milkywayidle.com/*
  9. // @icon https://www.milkywayidle.com/favicon.svg
  10. // @grant none
  11. // @require https://cdn.jsdelivr.net/npm/chart.js@4.4.3/dist/chart.umd.min.js
  12. // @require https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns@3.0.0/dist/chartjs-adapter-date-fns.bundle.min.js
  13. // @require https://cdn.jsdelivr.net/npm/chartjs-plugin-crosshair@2.0.0/dist/chartjs-plugin-crosshair.min.js
  14. // @run-at document-start
  15. // @license MIT
  16. // ==/UserScript==
  17.  
  18. (function () {
  19. 'use strict';
  20. let injectSpace = "mwi";//use window.mwi to access the injected object
  21. if (window[injectSpace]) return;//已经注入
  22. let mwi = {//供外部调用的接口
  23. //由于脚本加载问题,注入有可能失败
  24. //修改了hookCallback,添加了回调前和回调后处理
  25. version: "0.4.0",//版本号,未改动原有接口只更新最后一个版本号,更改了接口会更改次版本号,主版本暂时不更新,等稳定之后再考虑主版本号更新
  26. MWICoreInitialized: false,//是否初始化完成,完成会还会通过window发送一个自定义事件 MWICoreInitialized
  27. game: null,//注入游戏对象,可以直接访问游戏中的大量数据和方法以及消息事件等
  28. lang: null,//语言翻译, 例如中文物品lang.zh.translation.itemNames['/items/coin']
  29. buffCalculator: null,//注入buff计算对象buffCalculator.mergeBuffs()合并buffs,计算加成效果等
  30. alchemyCalculator: null,//注入炼金计算对象
  31.  
  32. //////非注入接口,保证可以使用的功能//////
  33. ///需要等待加载完成才能使用
  34.  
  35. coreMarket: null,//coreMarket.marketData 格式{"/items/apple_yogurt:0":{ask,bid,time}}
  36. initCharacterData: null,
  37. initClientData: JSON.parse(localStorage.getItem("initClientData") || "{}"),
  38. get character() { return this.game?.state?.character || this.initCharacterData?.character },
  39.  
  40. ///不需要等待加载的
  41.  
  42. get isZh() { return localStorage.getItem("i18nextLng")?.startsWith("zh"); },//是否中文
  43. /* marketJson兼容接口 */
  44. get marketJson() {
  45. return this.MWICoreInitialized && new Proxy(this.coreMarket, {
  46. get(coreMarket, prop) {
  47. if (prop === "market") {
  48. return new Proxy(coreMarket, {
  49. get(coreMarket, itemHridOrName) {
  50. return coreMarket.getItemPrice(itemHridOrName);
  51. }
  52. });
  53. }
  54. return null;
  55. }
  56.  
  57. });
  58. },
  59.  
  60. itemNameToHridDict: null,//物品名称反查表
  61.  
  62.  
  63. ensureItemHrid: function (itemHridOrName) {
  64. let itemHrid = this.itemNameToHridDict[itemHridOrName];
  65. if (itemHrid) return itemHrid;
  66. if (itemHridOrName?.startsWith("/items/")) return itemHridOrName;
  67. return null;
  68. },//各种名字转itemHrid,找不到返回原itemHrid或者null
  69. getItemDetail: function (itemHrid) {
  70. return this.initClientData?.itemDetailMap && this.initClientData.itemDetailMap[itemHrid];
  71. },
  72. hookMessage: hookMessage,//hook 游戏websocket消息 例如聊天消息mwi.hookMessage("chat_message_received",obj=>{console.log(obj)})
  73. hookCallback: hookCallback,//hook回调,可以hook游戏处理事件调用前后,方便做统计处理? 例如聊天消息mwi.hookCallback("handleMessageChatMessageReceived",obj=>{console.log("before")},obj=>{console.log("after")})
  74. fetchWithTimeout: fetchWithTimeout,//带超时的fetch
  75. };
  76. window[injectSpace] = mwi;
  77.  
  78. async function patchScript(node) {
  79. try {
  80. const scriptUrl = node.src;
  81. node.remove();
  82. const response = await fetch(scriptUrl);
  83. if (!response.ok) throw new Error(`Failed to fetch script: ${response.status}`);
  84.  
  85. let sourceCode = await response.text();
  86.  
  87. // Define injection points as configurable patterns
  88. const injectionPoints = [
  89. {
  90. pattern: "Ca.a.use",
  91. replacement: `window.${injectSpace}.lang=Oa;Ca.a.use`,
  92. description: "注入语言翻译对象"
  93. },
  94. {
  95. pattern: "class lp extends s.a.Component{constructor(e){var t;super(e),t=this,",
  96. replacement: `class lp extends s.a.Component{constructor(e){var t;super(e),t=this,window.${injectSpace}.game=this,`,
  97. description: "注入游戏对象"
  98.  
  99. },
  100. {
  101. pattern: "var Q=W;",
  102. replacement: `window.${injectSpace}.buffCalculator=W;var Q=W;`,
  103. description: "注入buff计算对象"
  104. },
  105. {
  106. pattern: "class Dn",
  107. replacement: `window.${injectSpace}.alchemyCalculator=Mn;class Dn`,
  108. description: "注入炼金计算对象"
  109. },
  110. {
  111. pattern: "var z=q;",
  112. replacement: `window.${injectSpace}.actionManager=q;var z=q;`,
  113. description: "注入动作管理对象"
  114. }
  115. ];
  116.  
  117. injectionPoints.forEach(({ pattern, replacement, description }) => {
  118. if (sourceCode.includes(pattern)) {
  119. sourceCode = sourceCode.replace(pattern, replacement);
  120. console.info(`MWICore injecting: ${description}`);
  121. } else {
  122. console.warn(`MWICore injecting failed: ${description}`);
  123. }
  124. });
  125.  
  126. const newNode = document.createElement('script');
  127. newNode.textContent = sourceCode;
  128. document.body.appendChild(newNode);
  129. console.info('MWICore patched successfully.')
  130. } catch (error) {
  131. console.error('MWICore patching failed:', error);
  132. }
  133. }
  134. new MutationObserver((mutationsList, obs) => {
  135. mutationsList.forEach((mutationRecord) => {
  136. for (const node of mutationRecord.addedNodes) {
  137. if (node.src) {
  138. if (node.src.search(/.*main\..*\.chunk.js/) === 0) {
  139. console.info("patching:" + node.src)
  140. obs.disconnect();
  141. patchScript(node);
  142. }
  143. }
  144. }
  145. });
  146. }).observe(document, { childList: true, subtree: true });
  147.  
  148. function hookWS() {
  149. const dataProperty = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data");
  150. const oriGet = dataProperty.get;
  151. dataProperty.get = hookedGet;
  152. Object.defineProperty(MessageEvent.prototype, "data", dataProperty);
  153.  
  154. function hookedGet() {
  155. const socket = this.currentTarget;
  156. if (!(socket instanceof WebSocket)) {
  157. return oriGet.call(this);
  158. }
  159. if (socket.url.indexOf("api.milkywayidle.com/ws") <= -1 && socket.url.indexOf("api-test.milkywayidle.com/ws") <= -1) {
  160. return oriGet.call(this);
  161. }
  162. const message = oriGet.call(this);
  163. Object.defineProperty(this, "data", { value: message }); // Anti-loop
  164.  
  165. try {
  166. let obj = JSON.parse(message);
  167. if (obj?.type) {
  168. if (obj.type === "init_character_data") {
  169. mwi.initCharacterData = obj;
  170. } else if (obj.type === "init_client_data") {
  171. mwi.initClientData = obj;
  172. }
  173.  
  174. dispatchEvent(new CustomEvent("MWI_" + obj.type, { detail: obj }));
  175. }
  176. } catch { console.error("dispatch error."); }
  177.  
  178. return message;
  179. }
  180. }
  181. hookWS();
  182. /**
  183. * Hook游戏消息在处理之前,随时可用
  184. * @param {string} message.type 消息类型,ws钩子,必定可用,仅在游戏处理之前调用beforeFunc
  185. * @param {Function} beforeFunc 前处理函数
  186. */
  187. function hookMessage(messageType, beforeFunc) {
  188. if (messageType && beforeFunc) {
  189. //游戏websocket消息hook
  190. addEventListener("MWI_" + messageType, (e) => beforeFunc(e.detail));
  191. } else {
  192. console.warn("messageType or beforeFunc is missing");
  193. }
  194. }
  195. /**
  196. * Hook游戏回调函数,仅在游戏注入成功时可用,会调用beforeFunc和afterFunc
  197. * @param {string} callbackProp 游戏处理回调函数名mwi.game.handleMessage*,仅当注入成功时可用,会调用beforeFunc和afterFunc
  198. * @param {Function} beforeFunc 前处理函数
  199. * @param {Function} afterFunc 后处理函数
  200. */
  201. function hookCallback(callbackProp, beforeFunc, afterFunc) {
  202. if (callbackProp && mwi?.game) {//优先使用游戏回调hook
  203. const targetObj = mwi.game;
  204. const originalCallback = targetObj[callbackProp];
  205.  
  206. if (!originalCallback || !targetObj) {
  207. throw new Error(`Callback ${callbackProp} does not exist`);
  208. }
  209.  
  210. targetObj[callbackProp] = function (...args) {
  211. // 前处理
  212. try {
  213. if (beforeFunc) beforeFunc(...args);
  214. } catch { }
  215. // 原始回调函数调用
  216. const result = originalCallback.apply(this, args);
  217. // 后处理
  218. try {
  219. if (afterFunc) afterFunc(result, ...args);
  220. } catch { }
  221. return result;
  222. };
  223.  
  224. // 返回取消Hook的方法
  225. return () => {
  226. targetObj[callbackProp] = originalCallback;
  227. };
  228. } else {
  229. console.warn("hookCallback error");
  230. }
  231. }
  232. /**
  233. * 带超时功能的fetch封装
  234. * @param {string} url - 请求URL
  235. * @param {object} options - fetch选项
  236. * @param {number} timeout - 超时时间(毫秒),默认10秒
  237. * @returns {Promise} - 返回fetch的Promise
  238. */
  239. function fetchWithTimeout(url, options = {}, timeout = 10000) {
  240. // 创建AbortController实例
  241. const controller = new AbortController();
  242. const { signal } = controller;
  243.  
  244. // 设置超时计时器
  245. const timeoutId = setTimeout(() => {
  246. controller.abort(new Error(`请求超时: ${timeout}ms`));
  247. }, timeout);
  248.  
  249. // 合并选项,添加signal
  250. const fetchOptions = {
  251. ...options,
  252. signal
  253. };
  254.  
  255. // 发起fetch请求
  256. return fetch(url, fetchOptions)
  257. .then(response => {
  258. // 清除超时计时器
  259. clearTimeout(timeoutId);
  260.  
  261. if (!response.ok) {
  262. throw new Error(`HTTP错误! 状态码: ${response.status}`);
  263. }
  264. return response;
  265. })
  266. .catch(error => {
  267. // 清除超时计时器
  268. clearTimeout(timeoutId);
  269.  
  270. // 如果是中止错误,重新抛出超时错误
  271. if (error.name === 'AbortError') {
  272. throw new Error(`请求超时: ${timeout}ms`);
  273. }
  274. throw error;
  275. });
  276. }
  277. function staticInit() {
  278. /*静态初始化,手动提取的游戏数据*/
  279. mwi.lang = {
  280. en: {
  281. translation: {
  282. ...{
  283. itemNames: {
  284. '/items/coin': 'Coin',
  285. '/items/task_token': 'Task Token',
  286. '/items/chimerical_token': 'Chimerical Token',
  287. '/items/sinister_token': 'Sinister Token',
  288. '/items/enchanted_token': 'Enchanted Token',
  289. '/items/pirate_token': 'Pirate Token',
  290. '/items/cowbell': 'Cowbell',
  291. '/items/bag_of_10_cowbells': 'Bag Of 10 Cowbells',
  292. '/items/purples_gift': 'Purple\'s Gift',
  293. '/items/small_meteorite_cache': 'Small Meteorite Cache',
  294. '/items/medium_meteorite_cache': 'Medium Meteorite Cache',
  295. '/items/large_meteorite_cache': 'Large Meteorite Cache',
  296. '/items/small_artisans_crate': 'Small Artisan\'s Crate',
  297. '/items/medium_artisans_crate': 'Medium Artisan\'s Crate',
  298. '/items/large_artisans_crate': 'Large Artisan\'s Crate',
  299. '/items/small_treasure_chest': 'Small Treasure Chest',
  300. '/items/medium_treasure_chest': 'Medium Treasure Chest',
  301. '/items/large_treasure_chest': 'Large Treasure Chest',
  302. '/items/chimerical_chest': 'Chimerical Chest',
  303. '/items/sinister_chest': 'Sinister Chest',
  304. '/items/enchanted_chest': 'Enchanted Chest',
  305. '/items/pirate_chest': 'Pirate Chest',
  306. '/items/blue_key_fragment': 'Blue Key Fragment',
  307. '/items/green_key_fragment': 'Green Key Fragment',
  308. '/items/purple_key_fragment': 'Purple Key Fragment',
  309. '/items/white_key_fragment': 'White Key Fragment',
  310. '/items/orange_key_fragment': 'Orange Key Fragment',
  311. '/items/brown_key_fragment': 'Brown Key Fragment',
  312. '/items/stone_key_fragment': 'Stone Key Fragment',
  313. '/items/dark_key_fragment': 'Dark Key Fragment',
  314. '/items/burning_key_fragment': 'Burning Key Fragment',
  315. '/items/chimerical_entry_key': 'Chimerical Entry Key',
  316. '/items/chimerical_chest_key': 'Chimerical Chest Key',
  317. '/items/sinister_entry_key': 'Sinister Entry Key',
  318. '/items/sinister_chest_key': 'Sinister Chest Key',
  319. '/items/enchanted_entry_key': 'Enchanted Entry Key',
  320. '/items/enchanted_chest_key': 'Enchanted Chest Key',
  321. '/items/pirate_entry_key': 'Pirate Entry Key',
  322. '/items/pirate_chest_key': 'Pirate Chest Key',
  323. '/items/donut': 'Donut',
  324. '/items/blueberry_donut': 'Blueberry Donut',
  325. '/items/blackberry_donut': 'Blackberry Donut',
  326. '/items/strawberry_donut': 'Strawberry Donut',
  327. '/items/mooberry_donut': 'Mooberry Donut',
  328. '/items/marsberry_donut': 'Marsberry Donut',
  329. '/items/spaceberry_donut': 'Spaceberry Donut',
  330. '/items/cupcake': 'Cupcake',
  331. '/items/blueberry_cake': 'Blueberry Cake',
  332. '/items/blackberry_cake': 'Blackberry Cake',
  333. '/items/strawberry_cake': 'Strawberry Cake',
  334. '/items/mooberry_cake': 'Mooberry Cake',
  335. '/items/marsberry_cake': 'Marsberry Cake',
  336. '/items/spaceberry_cake': 'Spaceberry Cake',
  337. '/items/gummy': 'Gummy',
  338. '/items/apple_gummy': 'Apple Gummy',
  339. '/items/orange_gummy': 'Orange Gummy',
  340. '/items/plum_gummy': 'Plum Gummy',
  341. '/items/peach_gummy': 'Peach Gummy',
  342. '/items/dragon_fruit_gummy': 'Dragon Fruit Gummy',
  343. '/items/star_fruit_gummy': 'Star Fruit Gummy',
  344. '/items/yogurt': 'Yogurt',
  345. '/items/apple_yogurt': 'Apple Yogurt',
  346. '/items/orange_yogurt': 'Orange Yogurt',
  347. '/items/plum_yogurt': 'Plum Yogurt',
  348. '/items/peach_yogurt': 'Peach Yogurt',
  349. '/items/dragon_fruit_yogurt': 'Dragon Fruit Yogurt',
  350. '/items/star_fruit_yogurt': 'Star Fruit Yogurt',
  351. '/items/milking_tea': 'Milking Tea',
  352. '/items/foraging_tea': 'Foraging Tea',
  353. '/items/woodcutting_tea': 'Woodcutting Tea',
  354. '/items/cooking_tea': 'Cooking Tea',
  355. '/items/brewing_tea': 'Brewing Tea',
  356. '/items/alchemy_tea': 'Alchemy Tea',
  357. '/items/enhancing_tea': 'Enhancing Tea',
  358. '/items/cheesesmithing_tea': 'Cheesesmithing Tea',
  359. '/items/crafting_tea': 'Crafting Tea',
  360. '/items/tailoring_tea': 'Tailoring Tea',
  361. '/items/super_milking_tea': 'Super Milking Tea',
  362. '/items/super_foraging_tea': 'Super Foraging Tea',
  363. '/items/super_woodcutting_tea': 'Super Woodcutting Tea',
  364. '/items/super_cooking_tea': 'Super Cooking Tea',
  365. '/items/super_brewing_tea': 'Super Brewing Tea',
  366. '/items/super_alchemy_tea': 'Super Alchemy Tea',
  367. '/items/super_enhancing_tea': 'Super Enhancing Tea',
  368. '/items/super_cheesesmithing_tea': 'Super Cheesesmithing Tea',
  369. '/items/super_crafting_tea': 'Super Crafting Tea',
  370. '/items/super_tailoring_tea': 'Super Tailoring Tea',
  371. '/items/ultra_milking_tea': 'Ultra Milking Tea',
  372. '/items/ultra_foraging_tea': 'Ultra Foraging Tea',
  373. '/items/ultra_woodcutting_tea': 'Ultra Woodcutting Tea',
  374. '/items/ultra_cooking_tea': 'Ultra Cooking Tea',
  375. '/items/ultra_brewing_tea': 'Ultra Brewing Tea',
  376. '/items/ultra_alchemy_tea': 'Ultra Alchemy Tea',
  377. '/items/ultra_enhancing_tea': 'Ultra Enhancing Tea',
  378. '/items/ultra_cheesesmithing_tea': 'Ultra Cheesesmithing Tea',
  379. '/items/ultra_crafting_tea': 'Ultra Crafting Tea',
  380. '/items/ultra_tailoring_tea': 'Ultra Tailoring Tea',
  381. '/items/gathering_tea': 'Gathering Tea',
  382. '/items/gourmet_tea': 'Gourmet Tea',
  383. '/items/wisdom_tea': 'Wisdom Tea',
  384. '/items/processing_tea': 'Processing Tea',
  385. '/items/efficiency_tea': 'Efficiency Tea',
  386. '/items/artisan_tea': 'Artisan Tea',
  387. '/items/catalytic_tea': 'Catalytic Tea',
  388. '/items/blessed_tea': 'Blessed Tea',
  389. '/items/stamina_coffee': 'Stamina Coffee',
  390. '/items/intelligence_coffee': 'Intelligence Coffee',
  391. '/items/defense_coffee': 'Defense Coffee',
  392. '/items/attack_coffee': 'Attack Coffee',
  393. '/items/power_coffee': 'Power Coffee',
  394. '/items/ranged_coffee': 'Ranged Coffee',
  395. '/items/magic_coffee': 'Magic Coffee',
  396. '/items/super_stamina_coffee': 'Super Stamina Coffee',
  397. '/items/super_intelligence_coffee': 'Super Intelligence Coffee',
  398. '/items/super_defense_coffee': 'Super Defense Coffee',
  399. '/items/super_attack_coffee': 'Super Attack Coffee',
  400. '/items/super_power_coffee': 'Super Power Coffee',
  401. '/items/super_ranged_coffee': 'Super Ranged Coffee',
  402. '/items/super_magic_coffee': 'Super Magic Coffee',
  403. '/items/ultra_stamina_coffee': 'Ultra Stamina Coffee',
  404. '/items/ultra_intelligence_coffee': 'Ultra Intelligence Coffee',
  405. '/items/ultra_defense_coffee': 'Ultra Defense Coffee',
  406. '/items/ultra_attack_coffee': 'Ultra Attack Coffee',
  407. '/items/ultra_power_coffee': 'Ultra Power Coffee',
  408. '/items/ultra_ranged_coffee': 'Ultra Ranged Coffee',
  409. '/items/ultra_magic_coffee': 'Ultra Magic Coffee',
  410. '/items/wisdom_coffee': 'Wisdom Coffee',
  411. '/items/lucky_coffee': 'Lucky Coffee',
  412. '/items/swiftness_coffee': 'Swiftness Coffee',
  413. '/items/channeling_coffee': 'Channeling Coffee',
  414. '/items/critical_coffee': 'Critical Coffee',
  415. '/items/poke': 'Poke',
  416. '/items/impale': 'Impale',
  417. '/items/puncture': 'Puncture',
  418. '/items/penetrating_strike': 'Penetrating Strike',
  419. '/items/scratch': 'Scratch',
  420. '/items/cleave': 'Cleave',
  421. '/items/maim': 'Maim',
  422. '/items/crippling_slash': 'Crippling Slash',
  423. '/items/smack': 'Smack',
  424. '/items/sweep': 'Sweep',
  425. '/items/stunning_blow': 'Stunning Blow',
  426. '/items/fracturing_impact': 'Fracturing Impact',
  427. '/items/shield_bash': 'Shield Bash',
  428. '/items/quick_shot': 'Quick Shot',
  429. '/items/aqua_arrow': 'Aqua Arrow',
  430. '/items/flame_arrow': 'Flame Arrow',
  431. '/items/rain_of_arrows': 'Rain Of Arrows',
  432. '/items/silencing_shot': 'Silencing Shot',
  433. '/items/steady_shot': 'Steady Shot',
  434. '/items/pestilent_shot': 'Pestilent Shot',
  435. '/items/penetrating_shot': 'Penetrating Shot',
  436. '/items/water_strike': 'Water Strike',
  437. '/items/ice_spear': 'Ice Spear',
  438. '/items/frost_surge': 'Frost Surge',
  439. '/items/mana_spring': 'Mana Spring',
  440. '/items/entangle': 'Entangle',
  441. '/items/toxic_pollen': 'Toxic Pollen',
  442. '/items/natures_veil': 'Nature\'s Veil',
  443. '/items/life_drain': 'Life Drain',
  444. '/items/fireball': 'Fireball',
  445. '/items/flame_blast': 'Flame Blast',
  446. '/items/firestorm': 'Firestorm',
  447. '/items/smoke_burst': 'Smoke Burst',
  448. '/items/minor_heal': 'Minor Heal',
  449. '/items/heal': 'Heal',
  450. '/items/quick_aid': 'Quick Aid',
  451. '/items/rejuvenate': 'Rejuvenate',
  452. '/items/taunt': 'Taunt',
  453. '/items/provoke': 'Provoke',
  454. '/items/toughness': 'Toughness',
  455. '/items/elusiveness': 'Elusiveness',
  456. '/items/precision': 'Precision',
  457. '/items/berserk': 'Berserk',
  458. '/items/elemental_affinity': 'Elemental Affinity',
  459. '/items/frenzy': 'Frenzy',
  460. '/items/spike_shell': 'Spike Shell',
  461. '/items/arcane_reflection': 'Arcane Reflection',
  462. '/items/vampirism': 'Vampirism',
  463. '/items/revive': 'Revive',
  464. '/items/insanity': 'Insanity',
  465. '/items/invincible': 'Invincible',
  466. '/items/fierce_aura': 'Fierce Aura',
  467. '/items/aqua_aura': 'Aqua Aura',
  468. '/items/sylvan_aura': 'Sylvan Aura',
  469. '/items/flame_aura': 'Flame Aura',
  470. '/items/speed_aura': 'Speed Aura',
  471. '/items/critical_aura': 'Critical Aura',
  472. '/items/gobo_stabber': 'Gobo Stabber',
  473. '/items/gobo_slasher': 'Gobo Slasher',
  474. '/items/gobo_smasher': 'Gobo Smasher',
  475. '/items/spiked_bulwark': 'Spiked Bulwark',
  476. '/items/werewolf_slasher': 'Werewolf Slasher',
  477. '/items/griffin_bulwark': 'Griffin Bulwark',
  478. '/items/gobo_shooter': 'Gobo Shooter',
  479. '/items/vampiric_bow': 'Vampiric Bow',
  480. '/items/cursed_bow': 'Cursed Bow',
  481. '/items/gobo_boomstick': 'Gobo Boomstick',
  482. '/items/cheese_bulwark': 'Cheese Bulwark',
  483. '/items/verdant_bulwark': 'Verdant Bulwark',
  484. '/items/azure_bulwark': 'Azure Bulwark',
  485. '/items/burble_bulwark': 'Burble Bulwark',
  486. '/items/crimson_bulwark': 'Crimson Bulwark',
  487. '/items/rainbow_bulwark': 'Rainbow Bulwark',
  488. '/items/holy_bulwark': 'Holy Bulwark',
  489. '/items/wooden_bow': 'Wooden Bow',
  490. '/items/birch_bow': 'Birch Bow',
  491. '/items/cedar_bow': 'Cedar Bow',
  492. '/items/purpleheart_bow': 'Purpleheart Bow',
  493. '/items/ginkgo_bow': 'Ginkgo Bow',
  494. '/items/redwood_bow': 'Redwood Bow',
  495. '/items/arcane_bow': 'Arcane Bow',
  496. '/items/stalactite_spear': 'Stalactite Spear',
  497. '/items/granite_bludgeon': 'Granite Bludgeon',
  498. '/items/furious_spear': 'Furious Spear',
  499. '/items/regal_sword': 'Regal Sword',
  500. '/items/chaotic_flail': 'Chaotic Flail',
  501. '/items/soul_hunter_crossbow': 'Soul Hunter Crossbow',
  502. '/items/sundering_crossbow': 'Sundering Crossbow',
  503. '/items/frost_staff': 'Frost Staff',
  504. '/items/infernal_battlestaff': 'Infernal Battlestaff',
  505. '/items/jackalope_staff': 'Jackalope Staff',
  506. '/items/rippling_trident': 'Rippling Trident',
  507. '/items/blooming_trident': 'Blooming Trident',
  508. '/items/blazing_trident': 'Blazing Trident',
  509. '/items/cheese_sword': 'Cheese Sword',
  510. '/items/verdant_sword': 'Verdant Sword',
  511. '/items/azure_sword': 'Azure Sword',
  512. '/items/burble_sword': 'Burble Sword',
  513. '/items/crimson_sword': 'Crimson Sword',
  514. '/items/rainbow_sword': 'Rainbow Sword',
  515. '/items/holy_sword': 'Holy Sword',
  516. '/items/cheese_spear': 'Cheese Spear',
  517. '/items/verdant_spear': 'Verdant Spear',
  518. '/items/azure_spear': 'Azure Spear',
  519. '/items/burble_spear': 'Burble Spear',
  520. '/items/crimson_spear': 'Crimson Spear',
  521. '/items/rainbow_spear': 'Rainbow Spear',
  522. '/items/holy_spear': 'Holy Spear',
  523. '/items/cheese_mace': 'Cheese Mace',
  524. '/items/verdant_mace': 'Verdant Mace',
  525. '/items/azure_mace': 'Azure Mace',
  526. '/items/burble_mace': 'Burble Mace',
  527. '/items/crimson_mace': 'Crimson Mace',
  528. '/items/rainbow_mace': 'Rainbow Mace',
  529. '/items/holy_mace': 'Holy Mace',
  530. '/items/wooden_crossbow': 'Wooden Crossbow',
  531. '/items/birch_crossbow': 'Birch Crossbow',
  532. '/items/cedar_crossbow': 'Cedar Crossbow',
  533. '/items/purpleheart_crossbow': 'Purpleheart Crossbow',
  534. '/items/ginkgo_crossbow': 'Ginkgo Crossbow',
  535. '/items/redwood_crossbow': 'Redwood Crossbow',
  536. '/items/arcane_crossbow': 'Arcane Crossbow',
  537. '/items/wooden_water_staff': 'Wooden Water Staff',
  538. '/items/birch_water_staff': 'Birch Water Staff',
  539. '/items/cedar_water_staff': 'Cedar Water Staff',
  540. '/items/purpleheart_water_staff': 'Purpleheart Water Staff',
  541. '/items/ginkgo_water_staff': 'Ginkgo Water Staff',
  542. '/items/redwood_water_staff': 'Redwood Water Staff',
  543. '/items/arcane_water_staff': 'Arcane Water Staff',
  544. '/items/wooden_nature_staff': 'Wooden Nature Staff',
  545. '/items/birch_nature_staff': 'Birch Nature Staff',
  546. '/items/cedar_nature_staff': 'Cedar Nature Staff',
  547. '/items/purpleheart_nature_staff': 'Purpleheart Nature Staff',
  548. '/items/ginkgo_nature_staff': 'Ginkgo Nature Staff',
  549. '/items/redwood_nature_staff': 'Redwood Nature Staff',
  550. '/items/arcane_nature_staff': 'Arcane Nature Staff',
  551. '/items/wooden_fire_staff': 'Wooden Fire Staff',
  552. '/items/birch_fire_staff': 'Birch Fire Staff',
  553. '/items/cedar_fire_staff': 'Cedar Fire Staff',
  554. '/items/purpleheart_fire_staff': 'Purpleheart Fire Staff',
  555. '/items/ginkgo_fire_staff': 'Ginkgo Fire Staff',
  556. '/items/redwood_fire_staff': 'Redwood Fire Staff',
  557. '/items/arcane_fire_staff': 'Arcane Fire Staff',
  558. '/items/eye_watch': 'Eye Watch',
  559. '/items/snake_fang_dirk': 'Snake Fang Dirk',
  560. '/items/vision_shield': 'Vision Shield',
  561. '/items/gobo_defender': 'Gobo Defender',
  562. '/items/vampire_fang_dirk': 'Vampire Fang Dirk',
  563. '/items/knights_aegis': 'Knight\'s Aegis',
  564. '/items/treant_shield': 'Treant Shield',
  565. '/items/manticore_shield': 'Manticore Shield',
  566. '/items/tome_of_healing': 'Tome Of Healing',
  567. '/items/tome_of_the_elements': 'Tome Of The Elements',
  568. '/items/watchful_relic': 'Watchful Relic',
  569. '/items/bishops_codex': 'Bishop\'s Codex',
  570. '/items/cheese_buckler': 'Cheese Buckler',
  571. '/items/verdant_buckler': 'Verdant Buckler',
  572. '/items/azure_buckler': 'Azure Buckler',
  573. '/items/burble_buckler': 'Burble Buckler',
  574. '/items/crimson_buckler': 'Crimson Buckler',
  575. '/items/rainbow_buckler': 'Rainbow Buckler',
  576. '/items/holy_buckler': 'Holy Buckler',
  577. '/items/wooden_shield': 'Wooden Shield',
  578. '/items/birch_shield': 'Birch Shield',
  579. '/items/cedar_shield': 'Cedar Shield',
  580. '/items/purpleheart_shield': 'Purpleheart Shield',
  581. '/items/ginkgo_shield': 'Ginkgo Shield',
  582. '/items/redwood_shield': 'Redwood Shield',
  583. '/items/arcane_shield': 'Arcane Shield',
  584. '/items/sinister_cape': 'Sinister Cape',
  585. '/items/chimerical_quiver': 'Chimerical Quiver',
  586. '/items/enchanted_cloak': 'Enchanted Cloak',
  587. '/items/red_culinary_hat': 'Red Culinary Hat',
  588. '/items/snail_shell_helmet': 'Snail Shell Helmet',
  589. '/items/vision_helmet': 'Vision Helmet',
  590. '/items/fluffy_red_hat': 'Fluffy Red Hat',
  591. '/items/corsair_helmet': 'Corsair Helmet',
  592. '/items/acrobatic_hood': 'Acrobatic Hood',
  593. '/items/magicians_hat': 'Magician\'s Hat',
  594. '/items/cheese_helmet': 'Cheese Helmet',
  595. '/items/verdant_helmet': 'Verdant Helmet',
  596. '/items/azure_helmet': 'Azure Helmet',
  597. '/items/burble_helmet': 'Burble Helmet',
  598. '/items/crimson_helmet': 'Crimson Helmet',
  599. '/items/rainbow_helmet': 'Rainbow Helmet',
  600. '/items/holy_helmet': 'Holy Helmet',
  601. '/items/rough_hood': 'Rough Hood',
  602. '/items/reptile_hood': 'Reptile Hood',
  603. '/items/gobo_hood': 'Gobo Hood',
  604. '/items/beast_hood': 'Beast Hood',
  605. '/items/umbral_hood': 'Umbral Hood',
  606. '/items/cotton_hat': 'Cotton Hat',
  607. '/items/linen_hat': 'Linen Hat',
  608. '/items/bamboo_hat': 'Bamboo Hat',
  609. '/items/silk_hat': 'Silk Hat',
  610. '/items/radiant_hat': 'Radiant Hat',
  611. '/items/dairyhands_top': 'Dairyhand\'s Top',
  612. '/items/foragers_top': 'Forager\'s Top',
  613. '/items/lumberjacks_top': 'Lumberjack\'s Top',
  614. '/items/cheesemakers_top': 'Cheesemaker\'s Top',
  615. '/items/crafters_top': 'Crafter\'s Top',
  616. '/items/tailors_top': 'Tailor\'s Top',
  617. '/items/chefs_top': 'Chef\'s Top',
  618. '/items/brewers_top': 'Brewer\'s Top',
  619. '/items/alchemists_top': 'Alchemist\'s Top',
  620. '/items/enhancers_top': 'Enhancer\'s Top',
  621. '/items/gator_vest': 'Gator Vest',
  622. '/items/turtle_shell_body': 'Turtle Shell Body',
  623. '/items/colossus_plate_body': 'Colossus Plate Body',
  624. '/items/demonic_plate_body': 'Demonic Plate Body',
  625. '/items/anchorbound_plate_body': 'Anchorbound Plate Body',
  626. '/items/maelstrom_plate_body': 'Maelstrom Plate Body',
  627. '/items/marine_tunic': 'Marine Tunic',
  628. '/items/revenant_tunic': 'Revenant Tunic',
  629. '/items/griffin_tunic': 'Griffin Tunic',
  630. '/items/kraken_tunic': 'Kraken Tunic',
  631. '/items/icy_robe_top': 'Icy Robe Top',
  632. '/items/flaming_robe_top': 'Flaming Robe Top',
  633. '/items/luna_robe_top': 'Luna Robe Top',
  634. '/items/royal_water_robe_top': 'Royal Water Robe Top',
  635. '/items/royal_nature_robe_top': 'Royal Nature Robe Top',
  636. '/items/royal_fire_robe_top': 'Royal Fire Robe Top',
  637. '/items/cheese_plate_body': 'Cheese Plate Body',
  638. '/items/verdant_plate_body': 'Verdant Plate Body',
  639. '/items/azure_plate_body': 'Azure Plate Body',
  640. '/items/burble_plate_body': 'Burble Plate Body',
  641. '/items/crimson_plate_body': 'Crimson Plate Body',
  642. '/items/rainbow_plate_body': 'Rainbow Plate Body',
  643. '/items/holy_plate_body': 'Holy Plate Body',
  644. '/items/rough_tunic': 'Rough Tunic',
  645. '/items/reptile_tunic': 'Reptile Tunic',
  646. '/items/gobo_tunic': 'Gobo Tunic',
  647. '/items/beast_tunic': 'Beast Tunic',
  648. '/items/umbral_tunic': 'Umbral Tunic',
  649. '/items/cotton_robe_top': 'Cotton Robe Top',
  650. '/items/linen_robe_top': 'Linen Robe Top',
  651. '/items/bamboo_robe_top': 'Bamboo Robe Top',
  652. '/items/silk_robe_top': 'Silk Robe Top',
  653. '/items/radiant_robe_top': 'Radiant Robe Top',
  654. '/items/dairyhands_bottoms': 'Dairyhand\'s Bottoms',
  655. '/items/foragers_bottoms': 'Forager\'s Bottoms',
  656. '/items/lumberjacks_bottoms': 'Lumberjack\'s Bottoms',
  657. '/items/cheesemakers_bottoms': 'Cheesemaker\'s Bottoms',
  658. '/items/crafters_bottoms': 'Crafter\'s Bottoms',
  659. '/items/tailors_bottoms': 'Tailor\'s Bottoms',
  660. '/items/chefs_bottoms': 'Chef\'s Bottoms',
  661. '/items/brewers_bottoms': 'Brewer\'s Bottoms',
  662. '/items/alchemists_bottoms': 'Alchemist\'s Bottoms',
  663. '/items/enhancers_bottoms': 'Enhancer\'s Bottoms',
  664. '/items/turtle_shell_legs': 'Turtle Shell Legs',
  665. '/items/colossus_plate_legs': 'Colossus Plate Legs',
  666. '/items/demonic_plate_legs': 'Demonic Plate Legs',
  667. '/items/anchorbound_plate_legs': 'Anchorbound Plate Legs',
  668. '/items/maelstrom_plate_legs': 'Maelstrom Plate Legs',
  669. '/items/marine_chaps': 'Marine Chaps',
  670. '/items/revenant_chaps': 'Revenant Chaps',
  671. '/items/griffin_chaps': 'Griffin Chaps',
  672. '/items/kraken_chaps': 'Kraken Chaps',
  673. '/items/icy_robe_bottoms': 'Icy Robe Bottoms',
  674. '/items/flaming_robe_bottoms': 'Flaming Robe Bottoms',
  675. '/items/luna_robe_bottoms': 'Luna Robe Bottoms',
  676. '/items/royal_water_robe_bottoms': 'Royal Water Robe Bottoms',
  677. '/items/royal_nature_robe_bottoms': 'Royal Nature Robe Bottoms',
  678. '/items/royal_fire_robe_bottoms': 'Royal Fire Robe Bottoms',
  679. '/items/cheese_plate_legs': 'Cheese Plate Legs',
  680. '/items/verdant_plate_legs': 'Verdant Plate Legs',
  681. '/items/azure_plate_legs': 'Azure Plate Legs',
  682. '/items/burble_plate_legs': 'Burble Plate Legs',
  683. '/items/crimson_plate_legs': 'Crimson Plate Legs',
  684. '/items/rainbow_plate_legs': 'Rainbow Plate Legs',
  685. '/items/holy_plate_legs': 'Holy Plate Legs',
  686. '/items/rough_chaps': 'Rough Chaps',
  687. '/items/reptile_chaps': 'Reptile Chaps',
  688. '/items/gobo_chaps': 'Gobo Chaps',
  689. '/items/beast_chaps': 'Beast Chaps',
  690. '/items/umbral_chaps': 'Umbral Chaps',
  691. '/items/cotton_robe_bottoms': 'Cotton Robe Bottoms',
  692. '/items/linen_robe_bottoms': 'Linen Robe Bottoms',
  693. '/items/bamboo_robe_bottoms': 'Bamboo Robe Bottoms',
  694. '/items/silk_robe_bottoms': 'Silk Robe Bottoms',
  695. '/items/radiant_robe_bottoms': 'Radiant Robe Bottoms',
  696. '/items/enchanted_gloves': 'Enchanted Gloves',
  697. '/items/pincer_gloves': 'Pincer Gloves',
  698. '/items/panda_gloves': 'Panda Gloves',
  699. '/items/magnetic_gloves': 'Magnetic Gloves',
  700. '/items/dodocamel_gauntlets': 'Dodocamel Gauntlets',
  701. '/items/sighted_bracers': 'Sighted Bracers',
  702. '/items/marksman_bracers': 'Marksman Bracers',
  703. '/items/chrono_gloves': 'Chrono Gloves',
  704. '/items/cheese_gauntlets': 'Cheese Gauntlets',
  705. '/items/verdant_gauntlets': 'Verdant Gauntlets',
  706. '/items/azure_gauntlets': 'Azure Gauntlets',
  707. '/items/burble_gauntlets': 'Burble Gauntlets',
  708. '/items/crimson_gauntlets': 'Crimson Gauntlets',
  709. '/items/rainbow_gauntlets': 'Rainbow Gauntlets',
  710. '/items/holy_gauntlets': 'Holy Gauntlets',
  711. '/items/rough_bracers': 'Rough Bracers',
  712. '/items/reptile_bracers': 'Reptile Bracers',
  713. '/items/gobo_bracers': 'Gobo Bracers',
  714. '/items/beast_bracers': 'Beast Bracers',
  715. '/items/umbral_bracers': 'Umbral Bracers',
  716. '/items/cotton_gloves': 'Cotton Gloves',
  717. '/items/linen_gloves': 'Linen Gloves',
  718. '/items/bamboo_gloves': 'Bamboo Gloves',
  719. '/items/silk_gloves': 'Silk Gloves',
  720. '/items/radiant_gloves': 'Radiant Gloves',
  721. '/items/collectors_boots': 'Collector\'s Boots',
  722. '/items/shoebill_shoes': 'Shoebill Shoes',
  723. '/items/black_bear_shoes': 'Black Bear Shoes',
  724. '/items/grizzly_bear_shoes': 'Grizzly Bear Shoes',
  725. '/items/polar_bear_shoes': 'Polar Bear Shoes',
  726. '/items/centaur_boots': 'Centaur Boots',
  727. '/items/sorcerer_boots': 'Sorcerer Boots',
  728. '/items/cheese_boots': 'Cheese Boots',
  729. '/items/verdant_boots': 'Verdant Boots',
  730. '/items/azure_boots': 'Azure Boots',
  731. '/items/burble_boots': 'Burble Boots',
  732. '/items/crimson_boots': 'Crimson Boots',
  733. '/items/rainbow_boots': 'Rainbow Boots',
  734. '/items/holy_boots': 'Holy Boots',
  735. '/items/rough_boots': 'Rough Boots',
  736. '/items/reptile_boots': 'Reptile Boots',
  737. '/items/gobo_boots': 'Gobo Boots',
  738. '/items/beast_boots': 'Beast Boots',
  739. '/items/umbral_boots': 'Umbral Boots',
  740. '/items/cotton_boots': 'Cotton Boots',
  741. '/items/linen_boots': 'Linen Boots',
  742. '/items/bamboo_boots': 'Bamboo Boots',
  743. '/items/silk_boots': 'Silk Boots',
  744. '/items/radiant_boots': 'Radiant Boots',
  745. '/items/small_pouch': 'Small Pouch',
  746. '/items/medium_pouch': 'Medium Pouch',
  747. '/items/large_pouch': 'Large Pouch',
  748. '/items/giant_pouch': 'Giant Pouch',
  749. '/items/gluttonous_pouch': 'Gluttonous Pouch',
  750. '/items/guzzling_pouch': 'Guzzling Pouch',
  751. '/items/necklace_of_efficiency': 'Necklace Of Efficiency',
  752. '/items/fighter_necklace': 'Fighter Necklace',
  753. '/items/ranger_necklace': 'Ranger Necklace',
  754. '/items/wizard_necklace': 'Wizard Necklace',
  755. '/items/necklace_of_wisdom': 'Necklace Of Wisdom',
  756. '/items/necklace_of_speed': 'Necklace Of Speed',
  757. '/items/philosophers_necklace': 'Philosopher\'s Necklace',
  758. '/items/earrings_of_gathering': 'Earrings Of Gathering',
  759. '/items/earrings_of_essence_find': 'Earrings Of Essence Find',
  760. '/items/earrings_of_armor': 'Earrings Of Armor',
  761. '/items/earrings_of_regeneration': 'Earrings Of Regeneration',
  762. '/items/earrings_of_resistance': 'Earrings Of Resistance',
  763. '/items/earrings_of_rare_find': 'Earrings Of Rare Find',
  764. '/items/earrings_of_critical_strike': 'Earrings Of Critical Strike',
  765. '/items/philosophers_earrings': 'Philosopher\'s Earrings',
  766. '/items/ring_of_gathering': 'Ring Of Gathering',
  767. '/items/ring_of_essence_find': 'Ring Of Essence Find',
  768. '/items/ring_of_armor': 'Ring Of Armor',
  769. '/items/ring_of_regeneration': 'Ring Of Regeneration',
  770. '/items/ring_of_resistance': 'Ring Of Resistance',
  771. '/items/ring_of_rare_find': 'Ring Of Rare Find',
  772. '/items/ring_of_critical_strike': 'Ring Of Critical Strike',
  773. '/items/philosophers_ring': 'Philosopher\'s Ring',
  774. '/items/basic_task_badge': 'Basic Task Badge',
  775. '/items/advanced_task_badge': 'Advanced Task Badge',
  776. '/items/expert_task_badge': 'Expert Task Badge',
  777. '/items/celestial_brush': 'Celestial Brush',
  778. '/items/cheese_brush': 'Cheese Brush',
  779. '/items/verdant_brush': 'Verdant Brush',
  780. '/items/azure_brush': 'Azure Brush',
  781. '/items/burble_brush': 'Burble Brush',
  782. '/items/crimson_brush': 'Crimson Brush',
  783. '/items/rainbow_brush': 'Rainbow Brush',
  784. '/items/holy_brush': 'Holy Brush',
  785. '/items/celestial_shears': 'Celestial Shears',
  786. '/items/cheese_shears': 'Cheese Shears',
  787. '/items/verdant_shears': 'Verdant Shears',
  788. '/items/azure_shears': 'Azure Shears',
  789. '/items/burble_shears': 'Burble Shears',
  790. '/items/crimson_shears': 'Crimson Shears',
  791. '/items/rainbow_shears': 'Rainbow Shears',
  792. '/items/holy_shears': 'Holy Shears',
  793. '/items/celestial_hatchet': 'Celestial Hatchet',
  794. '/items/cheese_hatchet': 'Cheese Hatchet',
  795. '/items/verdant_hatchet': 'Verdant Hatchet',
  796. '/items/azure_hatchet': 'Azure Hatchet',
  797. '/items/burble_hatchet': 'Burble Hatchet',
  798. '/items/crimson_hatchet': 'Crimson Hatchet',
  799. '/items/rainbow_hatchet': 'Rainbow Hatchet',
  800. '/items/holy_hatchet': 'Holy Hatchet',
  801. '/items/celestial_hammer': 'Celestial Hammer',
  802. '/items/cheese_hammer': 'Cheese Hammer',
  803. '/items/verdant_hammer': 'Verdant Hammer',
  804. '/items/azure_hammer': 'Azure Hammer',
  805. '/items/burble_hammer': 'Burble Hammer',
  806. '/items/crimson_hammer': 'Crimson Hammer',
  807. '/items/rainbow_hammer': 'Rainbow Hammer',
  808. '/items/holy_hammer': 'Holy Hammer',
  809. '/items/celestial_chisel': 'Celestial Chisel',
  810. '/items/cheese_chisel': 'Cheese Chisel',
  811. '/items/verdant_chisel': 'Verdant Chisel',
  812. '/items/azure_chisel': 'Azure Chisel',
  813. '/items/burble_chisel': 'Burble Chisel',
  814. '/items/crimson_chisel': 'Crimson Chisel',
  815. '/items/rainbow_chisel': 'Rainbow Chisel',
  816. '/items/holy_chisel': 'Holy Chisel',
  817. '/items/celestial_needle': 'Celestial Needle',
  818. '/items/cheese_needle': 'Cheese Needle',
  819. '/items/verdant_needle': 'Verdant Needle',
  820. '/items/azure_needle': 'Azure Needle',
  821. '/items/burble_needle': 'Burble Needle',
  822. '/items/crimson_needle': 'Crimson Needle',
  823. '/items/rainbow_needle': 'Rainbow Needle',
  824. '/items/holy_needle': 'Holy Needle',
  825. '/items/celestial_spatula': 'Celestial Spatula',
  826. '/items/cheese_spatula': 'Cheese Spatula',
  827. '/items/verdant_spatula': 'Verdant Spatula',
  828. '/items/azure_spatula': 'Azure Spatula',
  829. '/items/burble_spatula': 'Burble Spatula',
  830. '/items/crimson_spatula': 'Crimson Spatula',
  831. '/items/rainbow_spatula': 'Rainbow Spatula',
  832. '/items/holy_spatula': 'Holy Spatula',
  833. '/items/celestial_pot': 'Celestial Pot',
  834. '/items/cheese_pot': 'Cheese Pot',
  835. '/items/verdant_pot': 'Verdant Pot',
  836. '/items/azure_pot': 'Azure Pot',
  837. '/items/burble_pot': 'Burble Pot',
  838. '/items/crimson_pot': 'Crimson Pot',
  839. '/items/rainbow_pot': 'Rainbow Pot',
  840. '/items/holy_pot': 'Holy Pot',
  841. '/items/celestial_alembic': 'Celestial Alembic',
  842. '/items/cheese_alembic': 'Cheese Alembic',
  843. '/items/verdant_alembic': 'Verdant Alembic',
  844. '/items/azure_alembic': 'Azure Alembic',
  845. '/items/burble_alembic': 'Burble Alembic',
  846. '/items/crimson_alembic': 'Crimson Alembic',
  847. '/items/rainbow_alembic': 'Rainbow Alembic',
  848. '/items/holy_alembic': 'Holy Alembic',
  849. '/items/celestial_enhancer': 'Celestial Enhancer',
  850. '/items/cheese_enhancer': 'Cheese Enhancer',
  851. '/items/verdant_enhancer': 'Verdant Enhancer',
  852. '/items/azure_enhancer': 'Azure Enhancer',
  853. '/items/burble_enhancer': 'Burble Enhancer',
  854. '/items/crimson_enhancer': 'Crimson Enhancer',
  855. '/items/rainbow_enhancer': 'Rainbow Enhancer',
  856. '/items/holy_enhancer': 'Holy Enhancer',
  857. '/items/milk': 'Milk',
  858. '/items/verdant_milk': 'Verdant Milk',
  859. '/items/azure_milk': 'Azure Milk',
  860. '/items/burble_milk': 'Burble Milk',
  861. '/items/crimson_milk': 'Crimson Milk',
  862. '/items/rainbow_milk': 'Rainbow Milk',
  863. '/items/holy_milk': 'Holy Milk',
  864. '/items/cheese': 'Cheese',
  865. '/items/verdant_cheese': 'Verdant Cheese',
  866. '/items/azure_cheese': 'Azure Cheese',
  867. '/items/burble_cheese': 'Burble Cheese',
  868. '/items/crimson_cheese': 'Crimson Cheese',
  869. '/items/rainbow_cheese': 'Rainbow Cheese',
  870. '/items/holy_cheese': 'Holy Cheese',
  871. '/items/log': 'Log',
  872. '/items/birch_log': 'Birch Log',
  873. '/items/cedar_log': 'Cedar Log',
  874. '/items/purpleheart_log': 'Purpleheart Log',
  875. '/items/ginkgo_log': 'Ginkgo Log',
  876. '/items/redwood_log': 'Redwood Log',
  877. '/items/arcane_log': 'Arcane Log',
  878. '/items/lumber': 'Lumber',
  879. '/items/birch_lumber': 'Birch Lumber',
  880. '/items/cedar_lumber': 'Cedar Lumber',
  881. '/items/purpleheart_lumber': 'Purpleheart Lumber',
  882. '/items/ginkgo_lumber': 'Ginkgo Lumber',
  883. '/items/redwood_lumber': 'Redwood Lumber',
  884. '/items/arcane_lumber': 'Arcane Lumber',
  885. '/items/rough_hide': 'Rough Hide',
  886. '/items/reptile_hide': 'Reptile Hide',
  887. '/items/gobo_hide': 'Gobo Hide',
  888. '/items/beast_hide': 'Beast Hide',
  889. '/items/umbral_hide': 'Umbral Hide',
  890. '/items/rough_leather': 'Rough Leather',
  891. '/items/reptile_leather': 'Reptile Leather',
  892. '/items/gobo_leather': 'Gobo Leather',
  893. '/items/beast_leather': 'Beast Leather',
  894. '/items/umbral_leather': 'Umbral Leather',
  895. '/items/cotton': 'Cotton',
  896. '/items/flax': 'Flax',
  897. '/items/bamboo_branch': 'Bamboo Branch',
  898. '/items/cocoon': 'Cocoon',
  899. '/items/radiant_fiber': 'Radiant Fiber',
  900. '/items/cotton_fabric': 'Cotton Fabric',
  901. '/items/linen_fabric': 'Linen Fabric',
  902. '/items/bamboo_fabric': 'Bamboo Fabric',
  903. '/items/silk_fabric': 'Silk Fabric',
  904. '/items/radiant_fabric': 'Radiant Fabric',
  905. '/items/egg': 'Egg',
  906. '/items/wheat': 'Wheat',
  907. '/items/sugar': 'Sugar',
  908. '/items/blueberry': 'Blueberry',
  909. '/items/blackberry': 'Blackberry',
  910. '/items/strawberry': 'Strawberry',
  911. '/items/mooberry': 'Mooberry',
  912. '/items/marsberry': 'Marsberry',
  913. '/items/spaceberry': 'Spaceberry',
  914. '/items/apple': 'Apple',
  915. '/items/orange': 'Orange',
  916. '/items/plum': 'Plum',
  917. '/items/peach': 'Peach',
  918. '/items/dragon_fruit': 'Dragon Fruit',
  919. '/items/star_fruit': 'Star Fruit',
  920. '/items/arabica_coffee_bean': 'Arabica Coffee Bean',
  921. '/items/robusta_coffee_bean': 'Robusta Coffee Bean',
  922. '/items/liberica_coffee_bean': 'Liberica Coffee Bean',
  923. '/items/excelsa_coffee_bean': 'Excelsa Coffee Bean',
  924. '/items/fieriosa_coffee_bean': 'Fieriosa Coffee Bean',
  925. '/items/spacia_coffee_bean': 'Spacia Coffee Bean',
  926. '/items/green_tea_leaf': 'Green Tea Leaf',
  927. '/items/black_tea_leaf': 'Black Tea Leaf',
  928. '/items/burble_tea_leaf': 'Burble Tea Leaf',
  929. '/items/moolong_tea_leaf': 'Moolong Tea Leaf',
  930. '/items/red_tea_leaf': 'Red Tea Leaf',
  931. '/items/emp_tea_leaf': 'Emp Tea Leaf',
  932. '/items/catalyst_of_coinification': 'Catalyst Of Coinification',
  933. '/items/catalyst_of_decomposition': 'Catalyst Of Decomposition',
  934. '/items/catalyst_of_transmutation': 'Catalyst Of Transmutation',
  935. '/items/prime_catalyst': 'Prime Catalyst',
  936. '/items/snake_fang': 'Snake Fang',
  937. '/items/shoebill_feather': 'Shoebill Feather',
  938. '/items/snail_shell': 'Snail Shell',
  939. '/items/crab_pincer': 'Crab Pincer',
  940. '/items/turtle_shell': 'Turtle Shell',
  941. '/items/marine_scale': 'Marine Scale',
  942. '/items/treant_bark': 'Treant Bark',
  943. '/items/centaur_hoof': 'Centaur Hoof',
  944. '/items/luna_wing': 'Luna Wing',
  945. '/items/gobo_rag': 'Gobo Rag',
  946. '/items/goggles': 'Goggles',
  947. '/items/magnifying_glass': 'Magnifying Glass',
  948. '/items/eye_of_the_watcher': 'Eye Of The Watcher',
  949. '/items/icy_cloth': 'Icy Cloth',
  950. '/items/flaming_cloth': 'Flaming Cloth',
  951. '/items/sorcerers_sole': 'Sorcerer\'s Sole',
  952. '/items/chrono_sphere': 'Chrono Sphere',
  953. '/items/frost_sphere': 'Frost Sphere',
  954. '/items/panda_fluff': 'Panda Fluff',
  955. '/items/black_bear_fluff': 'Black Bear Fluff',
  956. '/items/grizzly_bear_fluff': 'Grizzly Bear Fluff',
  957. '/items/polar_bear_fluff': 'Polar Bear Fluff',
  958. '/items/red_panda_fluff': 'Red Panda Fluff',
  959. '/items/magnet': 'Magnet',
  960. '/items/stalactite_shard': 'Stalactite Shard',
  961. '/items/living_granite': 'Living Granite',
  962. '/items/colossus_core': 'Colossus Core',
  963. '/items/vampire_fang': 'Vampire Fang',
  964. '/items/werewolf_claw': 'Werewolf Claw',
  965. '/items/revenant_anima': 'Revenant Anima',
  966. '/items/soul_fragment': 'Soul Fragment',
  967. '/items/infernal_ember': 'Infernal Ember',
  968. '/items/demonic_core': 'Demonic Core',
  969. '/items/griffin_leather': 'Griffin Leather',
  970. '/items/manticore_sting': 'Manticore Sting',
  971. '/items/jackalope_antler': 'Jackalope Antler',
  972. '/items/dodocamel_plume': 'Dodocamel Plume',
  973. '/items/griffin_talon': 'Griffin Talon',
  974. '/items/acrobats_ribbon': 'Acrobat\'s Ribbon',
  975. '/items/magicians_cloth': 'Magician\'s Cloth',
  976. '/items/chaotic_chain': 'Chaotic Chain',
  977. '/items/cursed_ball': 'Cursed Ball',
  978. '/items/royal_cloth': 'Royal Cloth',
  979. '/items/knights_ingot': 'Knight\'s Ingot',
  980. '/items/bishops_scroll': 'Bishop\'s Scroll',
  981. '/items/regal_jewel': 'Regal Jewel',
  982. '/items/sundering_jewel': 'Sundering Jewel',
  983. '/items/marksman_brooch': 'Marksman Brooch',
  984. '/items/corsair_crest': 'Corsair Crest',
  985. '/items/damaged_anchor': 'Damaged Anchor',
  986. '/items/maelstrom_plating': 'Maelstrom Plating',
  987. '/items/kraken_leather': 'Kraken Leather',
  988. '/items/kraken_fang': 'Kraken Fang',
  989. '/items/butter_of_proficiency': 'Butter Of Proficiency',
  990. '/items/thread_of_expertise': 'Thread Of Expertise',
  991. '/items/branch_of_insight': 'Branch Of Insight',
  992. '/items/gluttonous_energy': 'Gluttonous Energy',
  993. '/items/guzzling_energy': 'Guzzling Energy',
  994. '/items/milking_essence': 'Milking Essence',
  995. '/items/foraging_essence': 'Foraging Essence',
  996. '/items/woodcutting_essence': 'Woodcutting Essence',
  997. '/items/cheesesmithing_essence': 'Cheesesmithing Essence',
  998. '/items/crafting_essence': 'Crafting Essence',
  999. '/items/tailoring_essence': 'Tailoring Essence',
  1000. '/items/cooking_essence': 'Cooking Essence',
  1001. '/items/brewing_essence': 'Brewing Essence',
  1002. '/items/alchemy_essence': 'Alchemy Essence',
  1003. '/items/enhancing_essence': 'Enhancing Essence',
  1004. '/items/swamp_essence': 'Swamp Essence',
  1005. '/items/aqua_essence': 'Aqua Essence',
  1006. '/items/jungle_essence': 'Jungle Essence',
  1007. '/items/gobo_essence': 'Gobo Essence',
  1008. '/items/eyessence': 'Eyessence',
  1009. '/items/sorcerer_essence': 'Sorcerer Essence',
  1010. '/items/bear_essence': 'Bear Essence',
  1011. '/items/golem_essence': 'Golem Essence',
  1012. '/items/twilight_essence': 'Twilight Essence',
  1013. '/items/abyssal_essence': 'Abyssal Essence',
  1014. '/items/chimerical_essence': 'Chimerical Essence',
  1015. '/items/sinister_essence': 'Sinister Essence',
  1016. '/items/enchanted_essence': 'Enchanted Essence',
  1017. '/items/pirate_essence': 'Pirate Essence',
  1018. '/items/task_crystal': 'Task Crystal',
  1019. '/items/star_fragment': 'Star Fragment',
  1020. '/items/pearl': 'Pearl',
  1021. '/items/amber': 'Amber',
  1022. '/items/garnet': 'Garnet',
  1023. '/items/jade': 'Jade',
  1024. '/items/amethyst': 'Amethyst',
  1025. '/items/moonstone': 'Moonstone',
  1026. '/items/sunstone': 'Sunstone',
  1027. '/items/philosophers_stone': 'Philosopher\'s Stone',
  1028. '/items/crushed_pearl': 'Crushed Pearl',
  1029. '/items/crushed_amber': 'Crushed Amber',
  1030. '/items/crushed_garnet': 'Crushed Garnet',
  1031. '/items/crushed_jade': 'Crushed Jade',
  1032. '/items/crushed_amethyst': 'Crushed Amethyst',
  1033. '/items/crushed_moonstone': 'Crushed Moonstone',
  1034. '/items/crushed_sunstone': 'Crushed Sunstone',
  1035. '/items/crushed_philosophers_stone': 'Crushed Philosopher\'s Stone',
  1036. '/items/shard_of_protection': 'Shard Of Protection',
  1037. '/items/mirror_of_protection': 'Mirror Of Protection'
  1038. },
  1039. }
  1040. }
  1041. },
  1042. zh: {
  1043. translation: {
  1044. ...{
  1045. itemNames: {
  1046. '/items/coin': '金币',
  1047. '/items/task_token': '任务代币',
  1048. '/items/chimerical_token': '奇幻代币',
  1049. '/items/sinister_token': '阴森代币',
  1050. '/items/enchanted_token': '秘法代币',
  1051. '/items/pirate_token': '海盗代币',
  1052. '/items/cowbell': '牛铃',
  1053. '/items/bag_of_10_cowbells': '牛铃袋 (10个)',
  1054. '/items/purples_gift': '小紫牛的礼物',
  1055. '/items/small_meteorite_cache': '小陨石舱',
  1056. '/items/medium_meteorite_cache': '中陨石舱',
  1057. '/items/large_meteorite_cache': '大陨石舱',
  1058. '/items/small_artisans_crate': '小工匠匣',
  1059. '/items/medium_artisans_crate': '中工匠匣',
  1060. '/items/large_artisans_crate': '大工匠匣',
  1061. '/items/small_treasure_chest': '小宝箱',
  1062. '/items/medium_treasure_chest': '中宝箱',
  1063. '/items/large_treasure_chest': '大宝箱',
  1064. '/items/chimerical_chest': '奇幻宝箱',
  1065. '/items/sinister_chest': '阴森宝箱',
  1066. '/items/enchanted_chest': '秘法宝箱',
  1067. '/items/pirate_chest': '海盗宝箱',
  1068. '/items/blue_key_fragment': '蓝色钥匙碎片',
  1069. '/items/green_key_fragment': '绿色钥匙碎片',
  1070. '/items/purple_key_fragment': '紫色钥匙碎片',
  1071. '/items/white_key_fragment': '白色钥匙碎片',
  1072. '/items/orange_key_fragment': '橙色钥匙碎片',
  1073. '/items/brown_key_fragment': '棕色钥匙碎片',
  1074. '/items/stone_key_fragment': '石头钥匙碎片',
  1075. '/items/dark_key_fragment': '黑暗钥匙碎片',
  1076. '/items/burning_key_fragment': '燃烧钥匙碎片',
  1077. '/items/chimerical_entry_key': '奇幻钥匙',
  1078. '/items/chimerical_chest_key': '奇幻宝箱钥匙',
  1079. '/items/sinister_entry_key': '阴森钥匙',
  1080. '/items/sinister_chest_key': '阴森宝箱钥匙',
  1081. '/items/enchanted_entry_key': '秘法钥匙',
  1082. '/items/enchanted_chest_key': '秘法宝箱钥匙',
  1083. '/items/pirate_entry_key': '海盗钥匙',
  1084. '/items/pirate_chest_key': '海盗宝箱钥匙',
  1085. '/items/donut': '甜甜圈',
  1086. '/items/blueberry_donut': '蓝莓甜甜圈',
  1087. '/items/blackberry_donut': '黑莓甜甜圈',
  1088. '/items/strawberry_donut': '草莓甜甜圈',
  1089. '/items/mooberry_donut': '哞莓甜甜圈',
  1090. '/items/marsberry_donut': '火星莓甜甜圈',
  1091. '/items/spaceberry_donut': '太空莓甜甜圈',
  1092. '/items/cupcake': '纸杯蛋糕',
  1093. '/items/blueberry_cake': '蓝莓蛋糕',
  1094. '/items/blackberry_cake': '黑莓蛋糕',
  1095. '/items/strawberry_cake': '草莓蛋糕',
  1096. '/items/mooberry_cake': '哞莓蛋糕',
  1097. '/items/marsberry_cake': '火星莓蛋糕',
  1098. '/items/spaceberry_cake': '太空莓蛋糕',
  1099. '/items/gummy': '软糖',
  1100. '/items/apple_gummy': '苹果软糖',
  1101. '/items/orange_gummy': '橙子软糖',
  1102. '/items/plum_gummy': '李子软糖',
  1103. '/items/peach_gummy': '桃子软糖',
  1104. '/items/dragon_fruit_gummy': '火龙果软糖',
  1105. '/items/star_fruit_gummy': '杨桃软糖',
  1106. '/items/yogurt': '酸奶',
  1107. '/items/apple_yogurt': '苹果酸奶',
  1108. '/items/orange_yogurt': '橙子酸奶',
  1109. '/items/plum_yogurt': '李子酸奶',
  1110. '/items/peach_yogurt': '桃子酸奶',
  1111. '/items/dragon_fruit_yogurt': '火龙果酸奶',
  1112. '/items/star_fruit_yogurt': '杨桃酸奶',
  1113. '/items/milking_tea': '挤奶茶',
  1114. '/items/foraging_tea': '采摘茶',
  1115. '/items/woodcutting_tea': '伐木茶',
  1116. '/items/cooking_tea': '烹饪茶',
  1117. '/items/brewing_tea': '冲泡茶',
  1118. '/items/alchemy_tea': '炼金茶',
  1119. '/items/enhancing_tea': '强化茶',
  1120. '/items/cheesesmithing_tea': '奶酪锻造茶',
  1121. '/items/crafting_tea': '制作茶',
  1122. '/items/tailoring_tea': '缝纫茶',
  1123. '/items/super_milking_tea': '超级挤奶茶',
  1124. '/items/super_foraging_tea': '超级采摘茶',
  1125. '/items/super_woodcutting_tea': '超级伐木茶',
  1126. '/items/super_cooking_tea': '超级烹饪茶',
  1127. '/items/super_brewing_tea': '超级冲泡茶',
  1128. '/items/super_alchemy_tea': '超级炼金茶',
  1129. '/items/super_enhancing_tea': '超级强化茶',
  1130. '/items/super_cheesesmithing_tea': '超级奶酪锻造茶',
  1131. '/items/super_crafting_tea': '超级制作茶',
  1132. '/items/super_tailoring_tea': '超级缝纫茶',
  1133. '/items/ultra_milking_tea': '究极挤奶茶',
  1134. '/items/ultra_foraging_tea': '究极采摘茶',
  1135. '/items/ultra_woodcutting_tea': '究极伐木茶',
  1136. '/items/ultra_cooking_tea': '究极烹饪茶',
  1137. '/items/ultra_brewing_tea': '究极冲泡茶',
  1138. '/items/ultra_alchemy_tea': '究极炼金茶',
  1139. '/items/ultra_enhancing_tea': '究极强化茶',
  1140. '/items/ultra_cheesesmithing_tea': '究极奶酪锻造茶',
  1141. '/items/ultra_crafting_tea': '究极制作茶',
  1142. '/items/ultra_tailoring_tea': '究极缝纫茶',
  1143. '/items/gathering_tea': '采集茶',
  1144. '/items/gourmet_tea': '美食茶',
  1145. '/items/wisdom_tea': '经验茶',
  1146. '/items/processing_tea': '加工茶',
  1147. '/items/efficiency_tea': '效率茶',
  1148. '/items/artisan_tea': '工匠茶',
  1149. '/items/catalytic_tea': '催化茶',
  1150. '/items/blessed_tea': '福气茶',
  1151. '/items/stamina_coffee': '耐力咖啡',
  1152. '/items/intelligence_coffee': '智力咖啡',
  1153. '/items/defense_coffee': '防御咖啡',
  1154. '/items/attack_coffee': '攻击咖啡',
  1155. '/items/power_coffee': '力量咖啡',
  1156. '/items/ranged_coffee': '远程咖啡',
  1157. '/items/magic_coffee': '魔法咖啡',
  1158. '/items/super_stamina_coffee': '超级耐力咖啡',
  1159. '/items/super_intelligence_coffee': '超级智力咖啡',
  1160. '/items/super_defense_coffee': '超级防御咖啡',
  1161. '/items/super_attack_coffee': '超级攻击咖啡',
  1162. '/items/super_power_coffee': '超级力量咖啡',
  1163. '/items/super_ranged_coffee': '超级远程咖啡',
  1164. '/items/super_magic_coffee': '超级魔法咖啡',
  1165. '/items/ultra_stamina_coffee': '究极耐力咖啡',
  1166. '/items/ultra_intelligence_coffee': '究极智力咖啡',
  1167. '/items/ultra_defense_coffee': '究极防御咖啡',
  1168. '/items/ultra_attack_coffee': '究极攻击咖啡',
  1169. '/items/ultra_power_coffee': '究极力量咖啡',
  1170. '/items/ultra_ranged_coffee': '究极远程咖啡',
  1171. '/items/ultra_magic_coffee': '究极魔法咖啡',
  1172. '/items/wisdom_coffee': '经验咖啡',
  1173. '/items/lucky_coffee': '幸运咖啡',
  1174. '/items/swiftness_coffee': '迅捷咖啡',
  1175. '/items/channeling_coffee': '吟唱咖啡',
  1176. '/items/critical_coffee': '暴击咖啡',
  1177. '/items/poke': '破胆之刺',
  1178. '/items/impale': '透骨之刺',
  1179. '/items/puncture': '破甲之刺',
  1180. '/items/penetrating_strike': '贯心之刺',
  1181. '/items/scratch': '爪影斩',
  1182. '/items/cleave': '分裂斩',
  1183. '/items/maim': '血刃斩',
  1184. '/items/crippling_slash': '致残斩',
  1185. '/items/smack': '重碾',
  1186. '/items/sweep': '重扫',
  1187. '/items/stunning_blow': '重锤',
  1188. '/items/fracturing_impact': '碎裂冲击',
  1189. '/items/shield_bash': '盾击',
  1190. '/items/quick_shot': '快速射击',
  1191. '/items/aqua_arrow': '流水箭',
  1192. '/items/flame_arrow': '烈焰箭',
  1193. '/items/rain_of_arrows': '箭雨',
  1194. '/items/silencing_shot': '沉默之箭',
  1195. '/items/steady_shot': '稳定射击',
  1196. '/items/pestilent_shot': '疫病射击',
  1197. '/items/penetrating_shot': '贯穿射击',
  1198. '/items/water_strike': '流水冲击',
  1199. '/items/ice_spear': '冰枪术',
  1200. '/items/frost_surge': '冰霜爆裂',
  1201. '/items/mana_spring': '法力喷泉',
  1202. '/items/entangle': '缠绕',
  1203. '/items/toxic_pollen': '剧毒粉尘',
  1204. '/items/natures_veil': '自然菌幕',
  1205. '/items/life_drain': '生命吸取',
  1206. '/items/fireball': '火球',
  1207. '/items/flame_blast': '熔岩爆裂',
  1208. '/items/firestorm': '火焰风暴',
  1209. '/items/smoke_burst': '烟爆灭影',
  1210. '/items/minor_heal': '初级自愈术',
  1211. '/items/heal': '自愈术',
  1212. '/items/quick_aid': '快速治疗术',
  1213. '/items/rejuvenate': '群体治疗术',
  1214. '/items/taunt': '嘲讽',
  1215. '/items/provoke': '挑衅',
  1216. '/items/toughness': '坚韧',
  1217. '/items/elusiveness': '闪避',
  1218. '/items/precision': '精确',
  1219. '/items/berserk': '狂暴',
  1220. '/items/elemental_affinity': '元素增幅',
  1221. '/items/frenzy': '狂速',
  1222. '/items/spike_shell': '尖刺防护',
  1223. '/items/arcane_reflection': '奥术反射',
  1224. '/items/vampirism': '吸血',
  1225. '/items/revive': '复活',
  1226. '/items/insanity': '疯狂',
  1227. '/items/invincible': '无敌',
  1228. '/items/fierce_aura': '物理光环',
  1229. '/items/aqua_aura': '流水光环',
  1230. '/items/sylvan_aura': '自然光环',
  1231. '/items/flame_aura': '火焰光环',
  1232. '/items/speed_aura': '速度光环',
  1233. '/items/critical_aura': '暴击光环',
  1234. '/items/gobo_stabber': '哥布林长剑',
  1235. '/items/gobo_slasher': '哥布林关刀',
  1236. '/items/gobo_smasher': '哥布林狼牙棒',
  1237. '/items/spiked_bulwark': '尖刺重盾',
  1238. '/items/werewolf_slasher': '狼人关刀',
  1239. '/items/griffin_bulwark': '狮鹫重盾',
  1240. '/items/gobo_shooter': '哥布林弹弓',
  1241. '/items/vampiric_bow': '吸血弓',
  1242. '/items/cursed_bow': '咒怨之弓',
  1243. '/items/gobo_boomstick': '哥布林火棍',
  1244. '/items/cheese_bulwark': '奶酪重盾',
  1245. '/items/verdant_bulwark': '翠绿重盾',
  1246. '/items/azure_bulwark': '蔚蓝重盾',
  1247. '/items/burble_bulwark': '深紫重盾',
  1248. '/items/crimson_bulwark': '绛红重盾',
  1249. '/items/rainbow_bulwark': '彩虹重盾',
  1250. '/items/holy_bulwark': '神圣重盾',
  1251. '/items/wooden_bow': '木弓',
  1252. '/items/birch_bow': '桦木弓',
  1253. '/items/cedar_bow': '雪松弓',
  1254. '/items/purpleheart_bow': '紫心弓',
  1255. '/items/ginkgo_bow': '银杏弓',
  1256. '/items/redwood_bow': '红杉弓',
  1257. '/items/arcane_bow': '神秘弓',
  1258. '/items/stalactite_spear': '石钟长枪',
  1259. '/items/granite_bludgeon': '花岗岩大棒',
  1260. '/items/furious_spear': '狂怒长枪',
  1261. '/items/regal_sword': '君王之剑',
  1262. '/items/chaotic_flail': '混沌连枷',
  1263. '/items/soul_hunter_crossbow': '灵魂猎手弩',
  1264. '/items/sundering_crossbow': '裂空之弩',
  1265. '/items/frost_staff': '冰霜法杖',
  1266. '/items/infernal_battlestaff': '炼狱法杖',
  1267. '/items/jackalope_staff': '鹿角兔之杖',
  1268. '/items/rippling_trident': '涟漪三叉戟',
  1269. '/items/blooming_trident': '绽放三叉戟',
  1270. '/items/blazing_trident': '炽焰三叉戟',
  1271. '/items/cheese_sword': '奶酪剑',
  1272. '/items/verdant_sword': '翠绿剑',
  1273. '/items/azure_sword': '蔚蓝剑',
  1274. '/items/burble_sword': '深紫剑',
  1275. '/items/crimson_sword': '绛红剑',
  1276. '/items/rainbow_sword': '彩虹剑',
  1277. '/items/holy_sword': '神圣剑',
  1278. '/items/cheese_spear': '奶酪长枪',
  1279. '/items/verdant_spear': '翠绿长枪',
  1280. '/items/azure_spear': '蔚蓝长枪',
  1281. '/items/burble_spear': '深紫长枪',
  1282. '/items/crimson_spear': '绛红长枪',
  1283. '/items/rainbow_spear': '彩虹长枪',
  1284. '/items/holy_spear': '神圣长枪',
  1285. '/items/cheese_mace': '奶酪钉头锤',
  1286. '/items/verdant_mace': '翠绿钉头锤',
  1287. '/items/azure_mace': '蔚蓝钉头锤',
  1288. '/items/burble_mace': '深紫钉头锤',
  1289. '/items/crimson_mace': '绛红钉头锤',
  1290. '/items/rainbow_mace': '彩虹钉头锤',
  1291. '/items/holy_mace': '神圣钉头锤',
  1292. '/items/wooden_crossbow': '木弩',
  1293. '/items/birch_crossbow': '桦木弩',
  1294. '/items/cedar_crossbow': '雪松弩',
  1295. '/items/purpleheart_crossbow': '紫心弩',
  1296. '/items/ginkgo_crossbow': '银杏弩',
  1297. '/items/redwood_crossbow': '红杉弩',
  1298. '/items/arcane_crossbow': '神秘弩',
  1299. '/items/wooden_water_staff': '木制水法杖',
  1300. '/items/birch_water_staff': '桦木水法杖',
  1301. '/items/cedar_water_staff': '雪松水法杖',
  1302. '/items/purpleheart_water_staff': '紫心水法杖',
  1303. '/items/ginkgo_water_staff': '银杏水法杖',
  1304. '/items/redwood_water_staff': '红杉水法杖',
  1305. '/items/arcane_water_staff': '神秘水法杖',
  1306. '/items/wooden_nature_staff': '木制自然法杖',
  1307. '/items/birch_nature_staff': '桦木自然法杖',
  1308. '/items/cedar_nature_staff': '雪松自然法杖',
  1309. '/items/purpleheart_nature_staff': '紫心自然法杖',
  1310. '/items/ginkgo_nature_staff': '银杏自然法杖',
  1311. '/items/redwood_nature_staff': '红杉自然法杖',
  1312. '/items/arcane_nature_staff': '神秘自然法杖',
  1313. '/items/wooden_fire_staff': '木制火法杖',
  1314. '/items/birch_fire_staff': '桦木火法杖',
  1315. '/items/cedar_fire_staff': '雪松火法杖',
  1316. '/items/purpleheart_fire_staff': '紫心火法杖',
  1317. '/items/ginkgo_fire_staff': '银杏火法杖',
  1318. '/items/redwood_fire_staff': '红杉火法杖',
  1319. '/items/arcane_fire_staff': '神秘火法杖',
  1320. '/items/eye_watch': '掌上监工',
  1321. '/items/snake_fang_dirk': '蛇牙短剑',
  1322. '/items/vision_shield': '视觉盾',
  1323. '/items/gobo_defender': '哥布林防御者',
  1324. '/items/vampire_fang_dirk': '吸血鬼短剑',
  1325. '/items/knights_aegis': '骑士盾',
  1326. '/items/treant_shield': '树人盾',
  1327. '/items/manticore_shield': '蝎狮盾',
  1328. '/items/tome_of_healing': '治疗之书',
  1329. '/items/tome_of_the_elements': '元素之书',
  1330. '/items/watchful_relic': '警戒遗物',
  1331. '/items/bishops_codex': '主教法典',
  1332. '/items/cheese_buckler': '奶酪圆盾',
  1333. '/items/verdant_buckler': '翠绿圆盾',
  1334. '/items/azure_buckler': '蔚蓝圆盾',
  1335. '/items/burble_buckler': '深紫圆盾',
  1336. '/items/crimson_buckler': '绛红圆盾',
  1337. '/items/rainbow_buckler': '彩虹圆盾',
  1338. '/items/holy_buckler': '神圣圆盾',
  1339. '/items/wooden_shield': '木盾',
  1340. '/items/birch_shield': '桦木盾',
  1341. '/items/cedar_shield': '雪松盾',
  1342. '/items/purpleheart_shield': '紫心盾',
  1343. '/items/ginkgo_shield': '银杏盾',
  1344. '/items/redwood_shield': '红杉盾',
  1345. '/items/arcane_shield': '神秘盾',
  1346. '/items/sinister_cape': '阴森斗篷',
  1347. '/items/chimerical_quiver': '奇幻箭袋',
  1348. '/items/enchanted_cloak': '秘法披风',
  1349. '/items/red_culinary_hat': '红色厨师帽',
  1350. '/items/snail_shell_helmet': '蜗牛壳头盔',
  1351. '/items/vision_helmet': '视觉头盔',
  1352. '/items/fluffy_red_hat': '蓬松红帽子',
  1353. '/items/corsair_helmet': '掠夺者头盔',
  1354. '/items/acrobatic_hood': '杂技师兜帽',
  1355. '/items/magicians_hat': '魔术师帽',
  1356. '/items/cheese_helmet': '奶酪头盔',
  1357. '/items/verdant_helmet': '翠绿头盔',
  1358. '/items/azure_helmet': '蔚蓝头盔',
  1359. '/items/burble_helmet': '深紫头盔',
  1360. '/items/crimson_helmet': '绛红头盔',
  1361. '/items/rainbow_helmet': '彩虹头盔',
  1362. '/items/holy_helmet': '神圣头盔',
  1363. '/items/rough_hood': '粗糙兜帽',
  1364. '/items/reptile_hood': '爬行动物兜帽',
  1365. '/items/gobo_hood': '哥布林兜帽',
  1366. '/items/beast_hood': '野兽兜帽',
  1367. '/items/umbral_hood': '暗影兜帽',
  1368. '/items/cotton_hat': '棉帽',
  1369. '/items/linen_hat': '亚麻帽',
  1370. '/items/bamboo_hat': '竹帽',
  1371. '/items/silk_hat': '丝帽',
  1372. '/items/radiant_hat': '光辉帽',
  1373. '/items/dairyhands_top': '挤奶工上衣',
  1374. '/items/foragers_top': '采摘者上衣',
  1375. '/items/lumberjacks_top': '伐木工上衣',
  1376. '/items/cheesemakers_top': '奶酪师上衣',
  1377. '/items/crafters_top': '工匠上衣',
  1378. '/items/tailors_top': '裁缝上衣',
  1379. '/items/chefs_top': '厨师上衣',
  1380. '/items/brewers_top': '饮品师上衣',
  1381. '/items/alchemists_top': '炼金师上衣',
  1382. '/items/enhancers_top': '强化师上衣',
  1383. '/items/gator_vest': '鳄鱼马甲',
  1384. '/items/turtle_shell_body': '龟壳胸甲',
  1385. '/items/colossus_plate_body': '巨像胸甲',
  1386. '/items/demonic_plate_body': '恶魔胸甲',
  1387. '/items/anchorbound_plate_body': '锚定胸甲',
  1388. '/items/maelstrom_plate_body': '怒涛胸甲',
  1389. '/items/marine_tunic': '海洋皮衣',
  1390. '/items/revenant_tunic': '亡灵皮衣',
  1391. '/items/griffin_tunic': '狮鹫皮衣',
  1392. '/items/kraken_tunic': '克拉肯皮衣',
  1393. '/items/icy_robe_top': '冰霜袍服',
  1394. '/items/flaming_robe_top': '烈焰袍服',
  1395. '/items/luna_robe_top': '月神袍服',
  1396. '/items/royal_water_robe_top': '皇家水系袍服',
  1397. '/items/royal_nature_robe_top': '皇家自然系袍服',
  1398. '/items/royal_fire_robe_top': '皇家火系袍服',
  1399. '/items/cheese_plate_body': '奶酪胸甲',
  1400. '/items/verdant_plate_body': '翠绿胸甲',
  1401. '/items/azure_plate_body': '蔚蓝胸甲',
  1402. '/items/burble_plate_body': '深紫胸甲',
  1403. '/items/crimson_plate_body': '绛红胸甲',
  1404. '/items/rainbow_plate_body': '彩虹胸甲',
  1405. '/items/holy_plate_body': '神圣胸甲',
  1406. '/items/rough_tunic': '粗糙皮衣',
  1407. '/items/reptile_tunic': '爬行动物皮衣',
  1408. '/items/gobo_tunic': '哥布林皮衣',
  1409. '/items/beast_tunic': '野兽皮衣',
  1410. '/items/umbral_tunic': '暗影皮衣',
  1411. '/items/cotton_robe_top': '棉布袍服',
  1412. '/items/linen_robe_top': '亚麻袍服',
  1413. '/items/bamboo_robe_top': '竹袍服',
  1414. '/items/silk_robe_top': '丝绸袍服',
  1415. '/items/radiant_robe_top': '光辉袍服',
  1416. '/items/dairyhands_bottoms': '挤奶工下装',
  1417. '/items/foragers_bottoms': '采摘者下装',
  1418. '/items/lumberjacks_bottoms': '伐木工下装',
  1419. '/items/cheesemakers_bottoms': '奶酪师下装',
  1420. '/items/crafters_bottoms': '工匠下装',
  1421. '/items/tailors_bottoms': '裁缝下装',
  1422. '/items/chefs_bottoms': '厨师下装',
  1423. '/items/brewers_bottoms': '饮品师下装',
  1424. '/items/alchemists_bottoms': '炼金师下装',
  1425. '/items/enhancers_bottoms': '强化师下装',
  1426. '/items/turtle_shell_legs': '龟壳腿甲',
  1427. '/items/colossus_plate_legs': '巨像腿甲',
  1428. '/items/demonic_plate_legs': '恶魔腿甲',
  1429. '/items/anchorbound_plate_legs': '锚定腿甲',
  1430. '/items/maelstrom_plate_legs': '怒涛腿甲',
  1431. '/items/marine_chaps': '航海皮裤',
  1432. '/items/revenant_chaps': '亡灵皮裤',
  1433. '/items/griffin_chaps': '狮鹫皮裤',
  1434. '/items/kraken_chaps': '克拉肯皮裤',
  1435. '/items/icy_robe_bottoms': '冰霜袍裙',
  1436. '/items/flaming_robe_bottoms': '烈焰袍裙',
  1437. '/items/luna_robe_bottoms': '月神袍裙',
  1438. '/items/royal_water_robe_bottoms': '皇家水系袍裙',
  1439. '/items/royal_nature_robe_bottoms': '皇家自然系袍裙',
  1440. '/items/royal_fire_robe_bottoms': '皇家火系袍裙',
  1441. '/items/cheese_plate_legs': '奶酪腿甲',
  1442. '/items/verdant_plate_legs': '翠绿腿甲',
  1443. '/items/azure_plate_legs': '蔚蓝腿甲',
  1444. '/items/burble_plate_legs': '深紫腿甲',
  1445. '/items/crimson_plate_legs': '绛红腿甲',
  1446. '/items/rainbow_plate_legs': '彩虹腿甲',
  1447. '/items/holy_plate_legs': '神圣腿甲',
  1448. '/items/rough_chaps': '粗糙皮裤',
  1449. '/items/reptile_chaps': '爬行动物皮裤',
  1450. '/items/gobo_chaps': '哥布林皮裤',
  1451. '/items/beast_chaps': '野兽皮裤',
  1452. '/items/umbral_chaps': '暗影皮裤',
  1453. '/items/cotton_robe_bottoms': '棉袍裙',
  1454. '/items/linen_robe_bottoms': '亚麻袍裙',
  1455. '/items/bamboo_robe_bottoms': '竹袍裙',
  1456. '/items/silk_robe_bottoms': '丝绸袍裙',
  1457. '/items/radiant_robe_bottoms': '光辉袍裙',
  1458. '/items/enchanted_gloves': '附魔手套',
  1459. '/items/pincer_gloves': '蟹钳手套',
  1460. '/items/panda_gloves': '熊猫手套',
  1461. '/items/magnetic_gloves': '磁力手套',
  1462. '/items/dodocamel_gauntlets': '渡渡驼护手',
  1463. '/items/sighted_bracers': '瞄准护腕',
  1464. '/items/marksman_bracers': '神射护腕',
  1465. '/items/chrono_gloves': '时空手套',
  1466. '/items/cheese_gauntlets': '奶酪护手',
  1467. '/items/verdant_gauntlets': '翠绿护手',
  1468. '/items/azure_gauntlets': '蔚蓝护手',
  1469. '/items/burble_gauntlets': '深紫护手',
  1470. '/items/crimson_gauntlets': '绛红护手',
  1471. '/items/rainbow_gauntlets': '彩虹护手',
  1472. '/items/holy_gauntlets': '神圣护手',
  1473. '/items/rough_bracers': '粗糙护腕',
  1474. '/items/reptile_bracers': '爬行动物护腕',
  1475. '/items/gobo_bracers': '哥布林护腕',
  1476. '/items/beast_bracers': '野兽护腕',
  1477. '/items/umbral_bracers': '暗影护腕',
  1478. '/items/cotton_gloves': '棉手套',
  1479. '/items/linen_gloves': '亚麻手套',
  1480. '/items/bamboo_gloves': '竹手套',
  1481. '/items/silk_gloves': '丝手套',
  1482. '/items/radiant_gloves': '光辉手套',
  1483. '/items/collectors_boots': '收藏家靴',
  1484. '/items/shoebill_shoes': '鲸头鹳鞋',
  1485. '/items/black_bear_shoes': '黑熊鞋',
  1486. '/items/grizzly_bear_shoes': '棕熊鞋',
  1487. '/items/polar_bear_shoes': '北极熊鞋',
  1488. '/items/centaur_boots': '半人马靴',
  1489. '/items/sorcerer_boots': '巫师靴',
  1490. '/items/cheese_boots': '奶酪靴',
  1491. '/items/verdant_boots': '翠绿靴',
  1492. '/items/azure_boots': '蔚蓝靴',
  1493. '/items/burble_boots': '深紫靴',
  1494. '/items/crimson_boots': '绛红靴',
  1495. '/items/rainbow_boots': '彩虹靴',
  1496. '/items/holy_boots': '神圣靴',
  1497. '/items/rough_boots': '粗糙靴',
  1498. '/items/reptile_boots': '爬行动物靴',
  1499. '/items/gobo_boots': '哥布林靴',
  1500. '/items/beast_boots': '野兽靴',
  1501. '/items/umbral_boots': '暗影靴',
  1502. '/items/cotton_boots': '棉靴',
  1503. '/items/linen_boots': '亚麻靴',
  1504. '/items/bamboo_boots': '竹靴',
  1505. '/items/silk_boots': '丝靴',
  1506. '/items/radiant_boots': '光辉靴',
  1507. '/items/small_pouch': '小袋子',
  1508. '/items/medium_pouch': '中袋子',
  1509. '/items/large_pouch': '大袋子',
  1510. '/items/giant_pouch': '巨大袋子',
  1511. '/items/gluttonous_pouch': '贪食之袋',
  1512. '/items/guzzling_pouch': '暴饮之囊',
  1513. '/items/necklace_of_efficiency': '效率项链',
  1514. '/items/fighter_necklace': '战士项链',
  1515. '/items/ranger_necklace': '射手项链',
  1516. '/items/wizard_necklace': '巫师项链',
  1517. '/items/necklace_of_wisdom': '经验项链',
  1518. '/items/necklace_of_speed': '速度项链',
  1519. '/items/philosophers_necklace': '贤者项链',
  1520. '/items/earrings_of_gathering': '采集耳环',
  1521. '/items/earrings_of_essence_find': '精华发现耳环',
  1522. '/items/earrings_of_armor': '护甲耳环',
  1523. '/items/earrings_of_regeneration': '恢复耳环',
  1524. '/items/earrings_of_resistance': '抗性耳环',
  1525. '/items/earrings_of_rare_find': '稀有发现耳环',
  1526. '/items/earrings_of_critical_strike': '暴击耳环',
  1527. '/items/philosophers_earrings': '贤者耳环',
  1528. '/items/ring_of_gathering': '采集戒指',
  1529. '/items/ring_of_essence_find': '精华发现戒指',
  1530. '/items/ring_of_armor': '护甲戒指',
  1531. '/items/ring_of_regeneration': '恢复戒指',
  1532. '/items/ring_of_resistance': '抗性戒指',
  1533. '/items/ring_of_rare_find': '稀有发现戒指',
  1534. '/items/ring_of_critical_strike': '暴击戒指',
  1535. '/items/philosophers_ring': '贤者戒指',
  1536. '/items/basic_task_badge': '基础任务徽章',
  1537. '/items/advanced_task_badge': '高级任务徽章',
  1538. '/items/expert_task_badge': '专家任务徽章',
  1539. '/items/celestial_brush': '星空刷子',
  1540. '/items/cheese_brush': '奶酪刷子',
  1541. '/items/verdant_brush': '翠绿刷子',
  1542. '/items/azure_brush': '蔚蓝刷子',
  1543. '/items/burble_brush': '深紫刷子',
  1544. '/items/crimson_brush': '绛红刷子',
  1545. '/items/rainbow_brush': '彩虹刷子',
  1546. '/items/holy_brush': '神圣刷子',
  1547. '/items/celestial_shears': '星空剪刀',
  1548. '/items/cheese_shears': '奶酪剪刀',
  1549. '/items/verdant_shears': '翠绿剪刀',
  1550. '/items/azure_shears': '蔚蓝剪刀',
  1551. '/items/burble_shears': '深紫剪刀',
  1552. '/items/crimson_shears': '绛红剪刀',
  1553. '/items/rainbow_shears': '彩虹剪刀',
  1554. '/items/holy_shears': '神圣剪刀',
  1555. '/items/celestial_hatchet': '星空斧头',
  1556. '/items/cheese_hatchet': '奶酪斧头',
  1557. '/items/verdant_hatchet': '翠绿斧头',
  1558. '/items/azure_hatchet': '蔚蓝斧头',
  1559. '/items/burble_hatchet': '深紫斧头',
  1560. '/items/crimson_hatchet': '绛红斧头',
  1561. '/items/rainbow_hatchet': '彩虹斧头',
  1562. '/items/holy_hatchet': '神圣斧头',
  1563. '/items/celestial_hammer': '星空锤子',
  1564. '/items/cheese_hammer': '奶酪锤子',
  1565. '/items/verdant_hammer': '翠绿锤子',
  1566. '/items/azure_hammer': '蔚蓝锤子',
  1567. '/items/burble_hammer': '深紫锤子',
  1568. '/items/crimson_hammer': '绛红锤子',
  1569. '/items/rainbow_hammer': '彩虹锤子',
  1570. '/items/holy_hammer': '神圣锤子',
  1571. '/items/celestial_chisel': '星空凿子',
  1572. '/items/cheese_chisel': '奶酪凿子',
  1573. '/items/verdant_chisel': '翠绿凿子',
  1574. '/items/azure_chisel': '蔚蓝凿子',
  1575. '/items/burble_chisel': '深紫凿子',
  1576. '/items/crimson_chisel': '绛红凿子',
  1577. '/items/rainbow_chisel': '彩虹凿子',
  1578. '/items/holy_chisel': '神圣凿子',
  1579. '/items/celestial_needle': '星空针',
  1580. '/items/cheese_needle': '奶酪针',
  1581. '/items/verdant_needle': '翠绿针',
  1582. '/items/azure_needle': '蔚蓝针',
  1583. '/items/burble_needle': '深紫针',
  1584. '/items/crimson_needle': '绛红针',
  1585. '/items/rainbow_needle': '彩虹针',
  1586. '/items/holy_needle': '神圣针',
  1587. '/items/celestial_spatula': '星空锅铲',
  1588. '/items/cheese_spatula': '奶酪锅铲',
  1589. '/items/verdant_spatula': '翠绿锅铲',
  1590. '/items/azure_spatula': '蔚蓝锅铲',
  1591. '/items/burble_spatula': '深紫锅铲',
  1592. '/items/crimson_spatula': '绛红锅铲',
  1593. '/items/rainbow_spatula': '彩虹锅铲',
  1594. '/items/holy_spatula': '神圣锅铲',
  1595. '/items/celestial_pot': '星空壶',
  1596. '/items/cheese_pot': '奶酪壶',
  1597. '/items/verdant_pot': '翠绿壶',
  1598. '/items/azure_pot': '蔚蓝壶',
  1599. '/items/burble_pot': '深紫壶',
  1600. '/items/crimson_pot': '绛红壶',
  1601. '/items/rainbow_pot': '彩虹壶',
  1602. '/items/holy_pot': '神圣壶',
  1603. '/items/celestial_alembic': '星空蒸馏器',
  1604. '/items/cheese_alembic': '奶酪蒸馏器',
  1605. '/items/verdant_alembic': '翠绿蒸馏器',
  1606. '/items/azure_alembic': '蔚蓝蒸馏器',
  1607. '/items/burble_alembic': '深紫蒸馏器',
  1608. '/items/crimson_alembic': '绛红蒸馏器',
  1609. '/items/rainbow_alembic': '彩虹蒸馏器',
  1610. '/items/holy_alembic': '神圣蒸馏器',
  1611. '/items/celestial_enhancer': '星空强化器',
  1612. '/items/cheese_enhancer': '奶酪强化器',
  1613. '/items/verdant_enhancer': '翠绿强化器',
  1614. '/items/azure_enhancer': '蔚蓝强化器',
  1615. '/items/burble_enhancer': '深紫强化器',
  1616. '/items/crimson_enhancer': '绛红强化器',
  1617. '/items/rainbow_enhancer': '彩虹强化器',
  1618. '/items/holy_enhancer': '神圣强化器',
  1619. '/items/milk': '牛奶',
  1620. '/items/verdant_milk': '翠绿牛奶',
  1621. '/items/azure_milk': '蔚蓝牛奶',
  1622. '/items/burble_milk': '深紫牛奶',
  1623. '/items/crimson_milk': '绛红牛奶',
  1624. '/items/rainbow_milk': '彩虹牛奶',
  1625. '/items/holy_milk': '神圣牛奶',
  1626. '/items/cheese': '奶酪',
  1627. '/items/verdant_cheese': '翠绿奶酪',
  1628. '/items/azure_cheese': '蔚蓝奶酪',
  1629. '/items/burble_cheese': '深紫奶酪',
  1630. '/items/crimson_cheese': '绛红奶酪',
  1631. '/items/rainbow_cheese': '彩虹奶酪',
  1632. '/items/holy_cheese': '神圣奶酪',
  1633. '/items/log': '原木',
  1634. '/items/birch_log': '白桦原木',
  1635. '/items/cedar_log': '雪松原木',
  1636. '/items/purpleheart_log': '紫心原木',
  1637. '/items/ginkgo_log': '银杏原木',
  1638. '/items/redwood_log': '红杉原木',
  1639. '/items/arcane_log': '神秘原木',
  1640. '/items/lumber': '木板',
  1641. '/items/birch_lumber': '白桦木板',
  1642. '/items/cedar_lumber': '雪松木板',
  1643. '/items/purpleheart_lumber': '紫心木板',
  1644. '/items/ginkgo_lumber': '银杏木板',
  1645. '/items/redwood_lumber': '红杉木板',
  1646. '/items/arcane_lumber': '神秘木板',
  1647. '/items/rough_hide': '粗糙兽皮',
  1648. '/items/reptile_hide': '爬行动物皮',
  1649. '/items/gobo_hide': '哥布林皮',
  1650. '/items/beast_hide': '野兽皮',
  1651. '/items/umbral_hide': '暗影皮',
  1652. '/items/rough_leather': '粗糙皮革',
  1653. '/items/reptile_leather': '爬行动物皮革',
  1654. '/items/gobo_leather': '哥布林皮革',
  1655. '/items/beast_leather': '野兽皮革',
  1656. '/items/umbral_leather': '暗影皮革',
  1657. '/items/cotton': '棉花',
  1658. '/items/flax': '亚麻',
  1659. '/items/bamboo_branch': '竹子',
  1660. '/items/cocoon': '蚕茧',
  1661. '/items/radiant_fiber': '光辉纤维',
  1662. '/items/cotton_fabric': '棉花布料',
  1663. '/items/linen_fabric': '亚麻布料',
  1664. '/items/bamboo_fabric': '竹子布料',
  1665. '/items/silk_fabric': '丝绸',
  1666. '/items/radiant_fabric': '光辉布料',
  1667. '/items/egg': '鸡蛋',
  1668. '/items/wheat': '小麦',
  1669. '/items/sugar': '糖',
  1670. '/items/blueberry': '蓝莓',
  1671. '/items/blackberry': '黑莓',
  1672. '/items/strawberry': '草莓',
  1673. '/items/mooberry': '哞莓',
  1674. '/items/marsberry': '火星莓',
  1675. '/items/spaceberry': '太空莓',
  1676. '/items/apple': '苹果',
  1677. '/items/orange': '橙子',
  1678. '/items/plum': '李子',
  1679. '/items/peach': '桃子',
  1680. '/items/dragon_fruit': '火龙果',
  1681. '/items/star_fruit': '杨桃',
  1682. '/items/arabica_coffee_bean': '低级咖啡豆',
  1683. '/items/robusta_coffee_bean': '中级咖啡豆',
  1684. '/items/liberica_coffee_bean': '高级咖啡豆',
  1685. '/items/excelsa_coffee_bean': '特级咖啡豆',
  1686. '/items/fieriosa_coffee_bean': '火山咖啡豆',
  1687. '/items/spacia_coffee_bean': '太空咖啡豆',
  1688. '/items/green_tea_leaf': '绿茶叶',
  1689. '/items/black_tea_leaf': '黑茶叶',
  1690. '/items/burble_tea_leaf': '紫茶叶',
  1691. '/items/moolong_tea_leaf': '哞龙茶叶',
  1692. '/items/red_tea_leaf': '红茶叶',
  1693. '/items/emp_tea_leaf': '虚空茶叶',
  1694. '/items/catalyst_of_coinification': '点金催化剂',
  1695. '/items/catalyst_of_decomposition': '分解催化剂',
  1696. '/items/catalyst_of_transmutation': '转化催化剂',
  1697. '/items/prime_catalyst': '至高催化剂',
  1698. '/items/snake_fang': '蛇牙',
  1699. '/items/shoebill_feather': '鲸头鹳羽毛',
  1700. '/items/snail_shell': '蜗牛壳',
  1701. '/items/crab_pincer': '蟹钳',
  1702. '/items/turtle_shell': '乌龟壳',
  1703. '/items/marine_scale': '海洋鳞片',
  1704. '/items/treant_bark': '树皮',
  1705. '/items/centaur_hoof': '半人马蹄',
  1706. '/items/luna_wing': '月神翼',
  1707. '/items/gobo_rag': '哥布林抹布',
  1708. '/items/goggles': '护目镜',
  1709. '/items/magnifying_glass': '放大镜',
  1710. '/items/eye_of_the_watcher': '观察者之眼',
  1711. '/items/icy_cloth': '冰霜织物',
  1712. '/items/flaming_cloth': '烈焰织物',
  1713. '/items/sorcerers_sole': '魔法师鞋底',
  1714. '/items/chrono_sphere': '时空球',
  1715. '/items/frost_sphere': '冰霜球',
  1716. '/items/panda_fluff': '熊猫绒',
  1717. '/items/black_bear_fluff': '黑熊绒',
  1718. '/items/grizzly_bear_fluff': '棕熊绒',
  1719. '/items/polar_bear_fluff': '北极熊绒',
  1720. '/items/red_panda_fluff': '小熊猫绒',
  1721. '/items/magnet': '磁铁',
  1722. '/items/stalactite_shard': '钟乳石碎片',
  1723. '/items/living_granite': '花岗岩',
  1724. '/items/colossus_core': '巨像核心',
  1725. '/items/vampire_fang': '吸血鬼之牙',
  1726. '/items/werewolf_claw': '狼人之爪',
  1727. '/items/revenant_anima': '亡者之魂',
  1728. '/items/soul_fragment': '灵魂碎片',
  1729. '/items/infernal_ember': '地狱余烬',
  1730. '/items/demonic_core': '恶魔核心',
  1731. '/items/griffin_leather': '狮鹫之皮',
  1732. '/items/manticore_sting': '蝎狮之刺',
  1733. '/items/jackalope_antler': '鹿角兔之角',
  1734. '/items/dodocamel_plume': '渡渡驼之翎',
  1735. '/items/griffin_talon': '狮鹫之爪',
  1736. '/items/acrobats_ribbon': '杂技师彩带',
  1737. '/items/magicians_cloth': '魔术师织物',
  1738. '/items/chaotic_chain': '混沌锁链',
  1739. '/items/cursed_ball': '诅咒之球',
  1740. '/items/royal_cloth': '皇家织物',
  1741. '/items/knights_ingot': '骑士之锭',
  1742. '/items/bishops_scroll': '主教卷轴',
  1743. '/items/regal_jewel': '君王宝石',
  1744. '/items/sundering_jewel': '裂空宝石',
  1745. '/items/marksman_brooch': '神射胸针',
  1746. '/items/corsair_crest': '掠夺者徽章',
  1747. '/items/damaged_anchor': '破损船锚',
  1748. '/items/maelstrom_plating': '怒涛甲片',
  1749. '/items/kraken_leather': '克拉肯皮革',
  1750. '/items/kraken_fang': '克拉肯之牙',
  1751. '/items/butter_of_proficiency': '精通之油',
  1752. '/items/thread_of_expertise': '专精之线',
  1753. '/items/branch_of_insight': '洞察之枝',
  1754. '/items/gluttonous_energy': '贪食能量',
  1755. '/items/guzzling_energy': '暴饮能量',
  1756. '/items/milking_essence': '挤奶精华',
  1757. '/items/foraging_essence': '采摘精华',
  1758. '/items/woodcutting_essence': '伐木精华',
  1759. '/items/cheesesmithing_essence': '奶酪锻造精华',
  1760. '/items/crafting_essence': '制作精华',
  1761. '/items/tailoring_essence': '缝纫精华',
  1762. '/items/cooking_essence': '烹饪精华',
  1763. '/items/brewing_essence': '冲泡精华',
  1764. '/items/alchemy_essence': '炼金精华',
  1765. '/items/enhancing_essence': '强化精华',
  1766. '/items/swamp_essence': '沼泽精华',
  1767. '/items/aqua_essence': '海洋精华',
  1768. '/items/jungle_essence': '丛林精华',
  1769. '/items/gobo_essence': '哥布林精华',
  1770. '/items/eyessence': '眼精华',
  1771. '/items/sorcerer_essence': '法师精华',
  1772. '/items/bear_essence': '熊熊精华',
  1773. '/items/golem_essence': '魔像精华',
  1774. '/items/twilight_essence': '暮光精华',
  1775. '/items/abyssal_essence': '地狱精华',
  1776. '/items/chimerical_essence': '奇幻精华',
  1777. '/items/sinister_essence': '阴森精华',
  1778. '/items/enchanted_essence': '秘法精华',
  1779. '/items/pirate_essence': '海盗精华',
  1780. '/items/task_crystal': '任务水晶',
  1781. '/items/star_fragment': '星光碎片',
  1782. '/items/pearl': '珍珠',
  1783. '/items/amber': '琥珀',
  1784. '/items/garnet': '石榴石',
  1785. '/items/jade': '翡翠',
  1786. '/items/amethyst': '紫水晶',
  1787. '/items/moonstone': '月亮石',
  1788. '/items/sunstone': '太阳石',
  1789. '/items/philosophers_stone': '贤者之石',
  1790. '/items/crushed_pearl': '珍珠碎片',
  1791. '/items/crushed_amber': '琥珀碎片',
  1792. '/items/crushed_garnet': '石榴石碎片',
  1793. '/items/crushed_jade': '翡翠碎片',
  1794. '/items/crushed_amethyst': '紫水晶碎片',
  1795. '/items/crushed_moonstone': '月亮石碎片',
  1796. '/items/crushed_sunstone': '太阳石碎片',
  1797. '/items/crushed_philosophers_stone': '贤者之石碎片',
  1798. '/items/shard_of_protection': '保护碎片',
  1799. '/items/mirror_of_protection': '保护之镜'
  1800. }
  1801. }
  1802. }
  1803. }
  1804. };
  1805. mwi.itemNameToHridDict = {};
  1806. Object.entries(mwi.lang.en.translation.itemNames).forEach(([k, v]) => { mwi.itemNameToHridDict[v] = k });
  1807. Object.entries(mwi.lang.zh.translation.itemNames).forEach(([k, v]) => { mwi.itemNameToHridDict[v] = k });
  1808. }
  1809. function injectedInit() {
  1810. /*注入成功,使用游戏数据*/
  1811. mwi.itemNameToHridDict = {};
  1812. Object.entries(mwi.lang.en.translation.itemNames).forEach(([k, v]) => { mwi.itemNameToHridDict[v] = k });
  1813. Object.entries(mwi.lang.zh.translation.itemNames).forEach(([k, v]) => { mwi.itemNameToHridDict[v] = k });
  1814.  
  1815. mwi.MWICoreInitialized = true;
  1816. window.dispatchEvent(new CustomEvent("MWICoreInitialized"))
  1817. console.info("MWICoreInitialized");
  1818. }
  1819. staticInit();
  1820. new Promise(resolve => {
  1821. let count = 0;
  1822. const interval = setInterval(() => {
  1823. count++;
  1824. if (count > 30) { clearInterval(interval) }//最多等待30秒
  1825. if (mwi.game && mwi.lang && mwi?.game?.state?.character?.gameMode) {//等待必须组件加载完毕后再初始化
  1826. clearInterval(interval);
  1827. resolve();
  1828. }
  1829. }, 1000);
  1830. }).then(() => {
  1831. injectedInit();
  1832. });
  1833.  
  1834. class ReconnectWebSocket {
  1835. constructor(url, options = {}) {
  1836. this.url = url; // WebSocket 服务器地址
  1837. this.reconnectInterval = options.reconnectInterval || 10000; // 重连间隔(默认 5 秒)
  1838. this.heartbeatInterval = options.heartbeatInterval || 60000; // 心跳间隔(默认 60 秒)
  1839. this.maxReconnectAttempts = options.maxReconnectAttempts || 9999999; // 最大重连次数
  1840. this.reconnectAttempts = 0; // 当前重连次数
  1841. this.ws = null; // WebSocket 实例
  1842. this.heartbeatTimer = null; // 心跳定时器
  1843. this.isManualClose = false; // 是否手动关闭连接
  1844.  
  1845. // 绑定事件处理器
  1846. this.onOpen = options.onOpen || (() => { });
  1847. this.onMessage = options.onMessage || (() => { });
  1848. this.onClose = options.onClose || (() => { });
  1849. this.onError = options.onError || (() => { });
  1850.  
  1851. this.connect();
  1852. }
  1853.  
  1854. // 连接 WebSocket
  1855. connect() {
  1856. this.ws = new WebSocket(this.url);
  1857.  
  1858. // WebSocket 打开事件
  1859. this.ws.onopen = () => {
  1860. console.info('WebMooket connected');
  1861. this.reconnectAttempts = 0; // 重置重连次数
  1862. this.startHeartbeat(); // 启动心跳
  1863. this.onOpen();
  1864. };
  1865.  
  1866. // WebSocket 消息事件
  1867. this.ws.onmessage = (event) => {
  1868. this.onMessage(event.data);
  1869. };
  1870.  
  1871. // WebSocket 关闭事件
  1872. this.ws.onclose = () => {
  1873. console.warn('WebMooket disconnected');
  1874. this.stopHeartbeat(); // 停止心跳
  1875. this.onClose();
  1876.  
  1877. if (!this.isManualClose) {
  1878. this.reconnect();
  1879. }
  1880. };
  1881.  
  1882. // WebSocket 错误事件
  1883. this.ws.onerror = (error) => {
  1884. console.error('WebMooket error:', error);
  1885. this.onError(error);
  1886. };
  1887. }
  1888.  
  1889. // 启动心跳
  1890. startHeartbeat() {
  1891. this.heartbeatTimer = setInterval(() => {
  1892. if (this.ws.readyState === WebSocket.OPEN) {
  1893. //this.ws.send("ping");
  1894. }
  1895. }, this.heartbeatInterval);
  1896. }
  1897.  
  1898. // 停止心跳
  1899. stopHeartbeat() {
  1900. if (this.heartbeatTimer) {
  1901. clearInterval(this.heartbeatTimer);
  1902. this.heartbeatTimer = null;
  1903. }
  1904. }
  1905.  
  1906. // 自动重连
  1907. reconnect() {
  1908. if (this.reconnectAttempts < this.maxReconnectAttempts) {
  1909. console.info(`Reconnecting in ${this.reconnectInterval / 1000} seconds...`);
  1910. setTimeout(() => {
  1911. this.reconnectAttempts++;
  1912. this.connect();
  1913. }, this.reconnectInterval);
  1914. } else {
  1915. console.error('Max reconnection attempts reached');
  1916. }
  1917. }
  1918.  
  1919. // 发送消息
  1920. send(data) {
  1921. if (this.ws.readyState === WebSocket.OPEN) {
  1922. this.ws.send(data);
  1923. } else {
  1924. console.warn('WebMooket is not open');
  1925. }
  1926. }
  1927.  
  1928. // 手动关闭连接
  1929. close() {
  1930. this.isManualClose = true;
  1931. this.ws.close();
  1932. }
  1933. }
  1934. /*实时市场模块*/
  1935. const HOST = "https://mooket.qi-e.top";
  1936. const MWIAPI_URL = "https://raw.githubusercontent.com/holychikenz/MWIApi/main/milkyapi.json";
  1937.  
  1938. class CoreMarket {
  1939. marketData = {};//市场数据,带强化等级,存储格式{"/items/apple_yogurt:0":{ask,bid,time}}
  1940. fetchTimeDict = {};//记录上次API请求时间,防止频繁请求
  1941. ttl = 300;//缓存时间,单位秒
  1942. trade_ws = null;
  1943. constructor() {
  1944. //core data
  1945. let marketDataStr = localStorage.getItem("MWICore_marketData") || "{}";
  1946. this.marketData = JSON.parse(marketDataStr);
  1947.  
  1948. //mwiapi data
  1949. let mwiapiJsonStr = localStorage.getItem("MWIAPI_JSON") || localStorage.getItem("MWITools_marketAPI_json");
  1950. let mwiapiObj = null;
  1951. if (mwiapiJsonStr) {
  1952. mwiapiObj = JSON.parse(mwiapiJsonStr);
  1953. this.mergeMWIData(mwiapiObj);
  1954. }
  1955. if (!mwiapiObj || Date.now() / 1000 - mwiapiObj.time > 600) {//超过10分才更新
  1956. fetch(MWIAPI_URL).then(res => {
  1957. res.text().then(mwiapiJsonStr => {
  1958. mwiapiObj = JSON.parse(mwiapiJsonStr);
  1959. this.mergeMWIData(mwiapiObj);
  1960. //更新本地缓存数据
  1961. localStorage.setItem("MWIAPI_JSON", mwiapiJsonStr);//更新本地缓存数据
  1962. console.info("MWIAPI_JSON updated:", new Date(mwiapiObj.time * 1000).toLocaleString());
  1963. })
  1964. });
  1965. }
  1966. //市场数据更新
  1967. hookMessage("market_item_order_books_updated", obj => this.handleMessageMarketItemOrderBooksUpdated(obj, true));
  1968. hookMessage("init_character_data", (msg) => {
  1969. if (msg.character.gameMode === "standard") {//标准模式才连接ws服务器,铁牛模式不连接ws服务器)
  1970. if (!this.trade_ws) {
  1971. this.trade_ws = new ReconnectWebSocket(`${HOST}/market/ws`);
  1972. this.trade_ws.onMessage = (data) => {
  1973. if (data === "ping") { return; }//心跳包,忽略
  1974. let obj = JSON.parse(data);
  1975. if (obj && obj.type === "market_item_order_books_updated") {
  1976. this.handleMessageMarketItemOrderBooksUpdated(obj, false);//收到市场服务器数据,不上传
  1977. } else if (obj && obj.type === "ItemPrice") {
  1978. this.processItemPrice(obj);
  1979. } else {
  1980. console.warn("unknown message:", data);
  1981. }
  1982. }
  1983. }
  1984. } else {
  1985. this.trade_ws?.disconnect();//断开连接
  1986. this.trade_ws = null;
  1987. }
  1988. });
  1989. setInterval(() => { this.save(); }, 1000 * 600);//十分钟保存一次
  1990. }
  1991. handleMessageMarketItemOrderBooksUpdated(obj, upload = false) {
  1992. //更新本地,游戏数据不带时间戳,市场服务器数据带时间戳
  1993. let timestamp = obj.time || parseInt(Date.now() / 1000);
  1994. let itemHrid = obj.marketItemOrderBooks.itemHrid;
  1995. obj.marketItemOrderBooks?.orderBooks?.forEach((item, enhancementLevel) => {
  1996. let bid = item.bids?.length > 0 ? item.bids[0].price : -1;
  1997. let ask = item.asks?.length > 0 ? item.asks[0].price : -1;
  1998. this.updateItem(itemHrid + ":" + enhancementLevel, { bid: bid, ask: ask, time: timestamp });
  1999. });
  2000. obj.time = timestamp;//添加时间戳
  2001. //上报数据
  2002. if (this.trade_ws) {//标准模式走ws
  2003. if (!upload) return;//只在game收到消息的时候上报
  2004. this.trade_ws.send(JSON.stringify(obj));//ws上报
  2005. } else {//铁牛上报
  2006. fetchWithTimeout(`${HOST}/market/upload/order`, {
  2007. method: "POST",
  2008. headers: {
  2009. "Content-Type": "application/json"
  2010. },
  2011. body: JSON.stringify(obj)
  2012. });
  2013. }
  2014. }
  2015. /**
  2016. * 合并MWIAPI数据,只包含0级物品
  2017. *
  2018. * @param obj 包含市场数据的对象
  2019. */
  2020. mergeMWIData(obj) {
  2021. Object.entries(obj.market).forEach(([itemName, price]) => {
  2022. let itemHrid = mwi.ensureItemHrid(itemName);
  2023. if (itemHrid) this.updateItem(itemHrid + ":" + 0, { bid: price.bid, ask: price.ask, time: obj.time }, false);//本地更新
  2024. });
  2025. this.save();
  2026. }
  2027. mergeCoreDataBeforeSave() {
  2028. let obj = JSON.parse(localStorage.getItem("MWICore_marketData") || "{}");
  2029. Object.entries(obj).forEach(([itemHridLevel, priceObj]) => {
  2030. this.updateItem(itemHridLevel, priceObj, false);//本地更新
  2031. });
  2032. //不保存,只合并
  2033. }
  2034. save() {//保存到localStorage
  2035. this.mergeCoreDataBeforeSave();//从其他角色合并保存的数据
  2036. localStorage.setItem("MWICore_marketData", JSON.stringify(this.marketData));
  2037. }
  2038.  
  2039. /**
  2040. * 部分特殊物品的价格
  2041. * 例如金币固定1,牛铃固定为牛铃袋/10的价格
  2042. * @param {string} itemHrid - 物品hrid
  2043. * @returns {Price|null} - 返回对应商品的价格对象,如果没有则null
  2044. */
  2045. getSpecialPrice(itemHrid) {
  2046. switch (itemHrid) {
  2047. case "/items/coin":
  2048. return { bid: 1, ask: 1, time: Date.now() / 1000 };
  2049. case "/items/cowbell": {
  2050. let cowbells = this.getItemPrice("/items/bag_of_10_cowbells");
  2051. return cowbells && { bid: cowbells.bid / 10, ask: cowbells.ask / 10, time: cowbells.time };
  2052. }
  2053. case "/items/bag_of_10_cowbells": return null;//走普通get,这里返回空
  2054. case "/items/task_crystal": {//固定点金收益5000,这里计算可能有bug
  2055. return { bid: 5000, ask: 5000, time: Date.now() / 1000 }
  2056. }
  2057. default:
  2058. let itemDetail = mwi.getItemDetail(itemHrid);
  2059. if (itemDetail?.categoryHrid === "/item_categories/loot") {//宝箱陨石
  2060. let totalAsk = 0;
  2061. let totalBid = 0;
  2062. let minTime = Date.now() / 1000;
  2063. this.getOpenableItems(itemHrid)?.forEach(openItem => {
  2064. let price = this.getItemPrice(openItem.itemHrid);
  2065. if (price) minTime = Math.min(minTime, price.time);
  2066. totalAsk += (price?.ask || 0) * openItem.count;//可以算平均价格
  2067. totalBid += (price?.bid || 0) * openItem.count;
  2068. });
  2069. return { bid: totalBid, ask: totalAsk, time: minTime };
  2070. }
  2071.  
  2072. if (mwi.character?.gameMode !== "standard") {//其他物品都按点金分解价值
  2073. return { ask: itemDetail.sellPrice * 5 * 0.7, bid: itemDetail.sellPrice * 5 * 0.7, time: Date.now() / 1000 };//铁牛模式显示物品价值使用点金价格*几率
  2074. }
  2075.  
  2076. return null;
  2077. }
  2078. }
  2079. getOpenableItems(itemHrid) {
  2080. let items = [];
  2081. for (let openItem of mwi.initClientData.openableLootDropMap[itemHrid]) {
  2082. if (openItem.itemHrid === "/items/purples_gift") continue;//防止循环
  2083. items.push({
  2084. itemHrid: openItem.itemHrid,
  2085. count: (openItem.minCount + openItem.maxCount) / 2 * openItem.dropRate
  2086. });
  2087. }
  2088. return items;
  2089. }
  2090. /**
  2091. * 获取商品的价格
  2092. *
  2093. * @param {string} itemHridOrName 商品HRID或名称
  2094. * @param {number} [enhancementLevel=0] 装备强化等级,普通商品默认为0
  2095. * @param {boolean} [peek=false] 是否只查看本地数据,不请求服务器数据
  2096. * @returns {number|null} 返回商品的价格,如果商品不存在或无法获取价格则返回null
  2097. */
  2098. getItemPrice(itemHridOrName, enhancementLevel = 0, peek = false) {
  2099. let itemHrid = mwi.ensureItemHrid(itemHridOrName);
  2100. if (!itemHrid) return null;
  2101. let specialPrice = this.getSpecialPrice(itemHrid);
  2102. if (specialPrice) return specialPrice;
  2103. let itemHridLevel = itemHrid + ":" + enhancementLevel;
  2104.  
  2105. let priceObj = this.marketData[itemHridLevel];
  2106. if (peek) return priceObj;
  2107.  
  2108. if (Date.now() / 1000 - this.fetchTimeDict[itemHridLevel] < this.ttl) return priceObj;//1分钟内直接返回本地数据,防止频繁请求服务器
  2109. this.fetchTimeDict[itemHridLevel] = Date.now() / 1000;
  2110. this.trade_ws?.send(JSON.stringify({ type: "GetItemPrice", name: itemHrid, level: enhancementLevel }));
  2111. return priceObj;
  2112. }
  2113. processItemPrice(resObj) {
  2114. let itemHridLevel = resObj.name + ":" + resObj.level;
  2115. let priceObj = { bid: resObj.bid, ask: resObj.ask, time: resObj.time };
  2116. if (resObj.ttl) this.ttl = resObj.ttl;//更新ttl
  2117. this.updateItem(itemHridLevel, priceObj);
  2118. }
  2119. updateItem(itemHridLevel, priceObj, isFetch = true) {
  2120. let localItem = this.marketData[itemHridLevel];
  2121. if (isFetch) this.fetchTimeDict[itemHridLevel] = Date.now() / 1000;//fetch时间戳
  2122. if (!localItem || localItem.time < priceObj.time) {//服务器数据更新则更新本地数据
  2123.  
  2124. let risePercent = 0;
  2125. if (localItem) {
  2126. let oriPrice = (localItem.ask + localItem.bid);
  2127. let newPrice = (priceObj.ask + priceObj.bid);
  2128. if (oriPrice != 0) risePercent = newPrice / oriPrice - 1;
  2129. }
  2130. this.marketData[itemHridLevel] = { rise: risePercent, ask: priceObj.ask, bid: priceObj.bid, time: priceObj.time };//更新本地数据
  2131. dispatchEvent(new CustomEvent("MWICoreItemPriceUpdated"), priceObj);//触发事件
  2132. }
  2133. }
  2134. resetRise() {
  2135. Object.entries(this.marketData).forEach(([k, v]) => {
  2136. v.rise = 0;
  2137. });
  2138. }
  2139. save() {
  2140. localStorage.setItem("MWICore_marketData", JSON.stringify(this.marketData));
  2141. }
  2142. }
  2143. mwi.coreMarket = new CoreMarket();
  2144. /*历史数据模块*/
  2145. function mooket() {
  2146.  
  2147. mwi.hookMessage("market_listings_updated", obj => {
  2148. obj.endMarketListings.forEach(order => {
  2149. if (order.filledQuantity == 0) return;//没有成交的订单不记录
  2150. let key = order.itemHrid + "_" + order.enhancementLevel;
  2151.  
  2152. let tradeItem = trade_history[key] || {}
  2153. if (order.isSell) {
  2154. tradeItem.sell = order.price;
  2155. } else {
  2156. tradeItem.buy = order.price;
  2157. }
  2158. trade_history[key] = tradeItem;
  2159. });
  2160. if (mwi.character?.gameMode === "standard") {//只记录标准模式的数据,因为铁牛不能交易
  2161. localStorage.setItem("mooket_trade_history", JSON.stringify(trade_history));//保存挂单数据
  2162. }
  2163. });
  2164.  
  2165. let trade_history = JSON.parse(localStorage.getItem("mooket_trade_history") || "{}");
  2166.  
  2167. let cur_day = 1;
  2168. let curHridName = null;
  2169. let curLevel = 0;
  2170. let curShowItemName = null;
  2171. let chartWidth = 500;
  2172. let chartHeight = 280
  2173.  
  2174. let configStr = localStorage.getItem("mooket_config");
  2175. let config = configStr ? JSON.parse(configStr) : { "dayIndex": 0, "visible": true, "filter": { "bid": true, "ask": true, "mean": true } };
  2176. cur_day = config.day;//读取设置
  2177.  
  2178. window.onresize = function () {
  2179. checkSize();
  2180. };
  2181. function checkSize() {
  2182. if (window.innerWidth < window.innerHeight) {//竖屏,强制设置
  2183. config.w = chartWidth = window.innerWidth * 0.8;
  2184. config.h = chartHeight = chartWidth * 0.6;
  2185. } else {
  2186. chartWidth = 400;
  2187. chartHeight = 250;
  2188. }
  2189. }
  2190. checkSize();
  2191.  
  2192. // 创建容器元素并设置样式和位置
  2193. const container = document.createElement('div');
  2194. container.style.border = "1px solid #ccc"; //边框样式
  2195. container.style.backgroundColor = "#282844";
  2196. container.style.position = "fixed";
  2197. container.style.zIndex = 10000;
  2198. container.style.top = `${Math.max(0, Math.min(config.y || 0, window.innerHeight - 50))}px`; //距离顶部位置
  2199. container.style.left = `${Math.max(0, Math.min(config.x || 0, window.innerWidth - 50))}px`; //距离左侧位置
  2200. container.style.width = `${Math.max(0, Math.min(config.w || chartWidth, window.innerWidth))}px`; //容器宽度
  2201. container.style.height = `${Math.max(0, Math.min(config.h || chartHeight, window.innerHeight))}px`; //容器高度
  2202. container.style.resize = "both";
  2203. container.style.overflow = "auto";
  2204. container.style.display = "none";
  2205. container.style.flexDirection = "column";
  2206. container.style.flex = "1";
  2207. container.style.minHeight = "33px";
  2208. container.style.minWidth = "68px";
  2209. container.style.cursor = "move";
  2210. container.style.userSelect = "none";
  2211.  
  2212. let mouseDragging = false;
  2213. let touchDragging = false;
  2214. let offsetX, offsetY;
  2215.  
  2216. let resizeEndTimer = null;
  2217. container.addEventListener("resize", () => {
  2218. if (resizeEndTimer) clearTimeout(resizeEndTimer);
  2219. resizeEndTimer = setTimeout(save_config, 1000);
  2220. });
  2221. container.addEventListener("mousedown", function (e) {
  2222. if (mouseDragging || touchDragging) return;
  2223. const rect = container.getBoundingClientRect();
  2224. if (container.style.resize === "both" && (e.clientX > rect.right - 10 && e.clientY > rect.bottom - 10)) return;
  2225. mouseDragging = true;
  2226. offsetX = e.clientX - container.offsetLeft;
  2227. offsetY = e.clientY - container.offsetTop;
  2228. });
  2229.  
  2230. document.addEventListener("mousemove", function (e) {
  2231. if (mouseDragging) {
  2232. var newX = e.clientX - offsetX;
  2233. var newY = e.clientY - offsetY;
  2234.  
  2235. if (newX < 0) newX = 0;
  2236. if (newY < 0) newY = 0;
  2237. if (newX > window.innerWidth - container.offsetWidth) newX = window.innerWidth - container.offsetWidth;
  2238. if (newY > window.innerHeight - container.offsetHeight) newY = window.innerHeight - container.offsetHeight;
  2239.  
  2240. container.style.left = newX + "px";
  2241. container.style.top = newY + "px";
  2242. }
  2243. });
  2244.  
  2245. document.addEventListener("mouseup", function () {
  2246. if (mouseDragging) {
  2247. mouseDragging = false;
  2248. save_config();
  2249. }
  2250. });
  2251.  
  2252. container.addEventListener("touchstart", function (e) {
  2253. if (mouseDragging || touchDragging) return;
  2254. const rect = container.getBoundingClientRect();
  2255. let touch = e.touches[0];
  2256. if (container.style.resize === "both" && (e.clientX > rect.right - 10 && e.clientY > rect.bottom - 10)) return;
  2257. touchDragging = true;
  2258. offsetX = touch.clientX - container.offsetLeft;
  2259. offsetY = touch.clientY - container.offsetTop;
  2260. });
  2261.  
  2262. document.addEventListener("touchmove", function (e) {
  2263. if (touchDragging) {
  2264. let touch = e.touches[0];
  2265. var newX = touch.clientX - offsetX;
  2266. var newY = touch.clientY - offsetY;
  2267.  
  2268. if (newX < 0) newX = 0;
  2269. if (newY < 0) newY = 0;
  2270. if (newX > window.innerWidth - container.offsetWidth) newX = window.innerWidth - container.offsetWidth;
  2271. if (newY > window.innerHeight - container.offsetHeight) newY = window.innerHeight - container.offsetHeight;
  2272.  
  2273. container.style.left = newX + "px";
  2274. container.style.top = newY + "px";
  2275. }
  2276. });
  2277.  
  2278. document.addEventListener("touchend", function () {
  2279. if (touchDragging) {
  2280. touchDragging = false;
  2281. save_config();
  2282. }
  2283. });
  2284. document.body.appendChild(container);
  2285.  
  2286. const ctx = document.createElement('canvas');
  2287. ctx.id = "mooChart";
  2288. container.appendChild(ctx);
  2289.  
  2290.  
  2291.  
  2292. // 创建下拉菜单并设置样式和位置
  2293. let wrapper = document.createElement('div');
  2294. wrapper.style.position = 'absolute';
  2295. wrapper.style.top = '5px';
  2296. wrapper.style.right = '16px';
  2297. wrapper.style.fontSize = '14px';
  2298.  
  2299. //wrapper.style.backgroundColor = '#fff';
  2300. wrapper.style.flexShrink = 0;
  2301. container.appendChild(wrapper);
  2302.  
  2303. const days = [1, 3, 7, 14, 30, 180, 360];
  2304. const dayTitle = ['1天', '3天', '1周', '2周', '1月', '半年', '一年'];
  2305. cur_day = days[config.dayIndex];
  2306.  
  2307. let select = document.createElement('select');
  2308. select.style.cursor = 'pointer';
  2309. select.style.verticalAlign = 'middle';
  2310. select.onchange = function () {
  2311. config.dayIndex = days.indexOf(parseInt(this.value));
  2312. if (curHridName) requestItemPrice(curHridName, this.value, curLevel);
  2313. save_config();
  2314. };
  2315.  
  2316. for (let i = 0; i < days.length; i++) {
  2317. let option = document.createElement('option');
  2318. option.value = days[i];
  2319. option.text = dayTitle[i];
  2320. if (i === config.dayIndex) option.selected = true;
  2321. select.appendChild(option);
  2322. }
  2323.  
  2324. wrapper.appendChild(select);
  2325.  
  2326. // 创建一个容器元素并设置样式和位置
  2327. const leftContainer = document.createElement('div');
  2328. leftContainer.style.padding = '2px'
  2329. leftContainer.style.display = 'flex';
  2330. leftContainer.style.flexDirection = 'row';
  2331. leftContainer.style.alignItems = 'center'
  2332. container.appendChild(leftContainer);
  2333.  
  2334. //添加一个btn隐藏canvas和wrapper
  2335. let btn_close = document.createElement('input');
  2336. btn_close.type = 'button';
  2337. btn_close.classList.add('Button_button__1Fe9z')
  2338. btn_close.value = '📈隐藏';
  2339. btn_close.style.margin = 0;
  2340. btn_close.style.cursor = 'pointer';
  2341.  
  2342. leftContainer.appendChild(btn_close);
  2343. /*
  2344. let picker = document.createElement('input');
  2345. picker.type = 'color';
  2346. picker.style.cursor = 'pointer';
  2347. picker.style.width = '20px';
  2348. picker.style.height = '20px';
  2349. picker.style.padding = "0"
  2350. picker.style.verticalAlign = "middle"
  2351. picker.onchange = function () {
  2352. container.style.backgroundColor = this.value;
  2353. config.bgcolor = this.value;
  2354. save_config();
  2355. }
  2356. wrapper.appendChild(picker);
  2357. */
  2358.  
  2359.  
  2360. //一个固定的文本显示买入卖出历史价格
  2361. let price_info = document.createElement('div');
  2362.  
  2363. price_info.style.fontSize = '14px';
  2364. price_info.title = "我的最近买/卖价格"
  2365. price_info.style.width = "max-content";
  2366. price_info.style.whiteSpace = "nowrap";
  2367. price_info.style.lineHeight = '25px';
  2368. price_info.style.display = 'none';
  2369. price_info.style.marginLeft = '5px';
  2370.  
  2371. let buy_price = document.createElement('span');
  2372. let sell_price = document.createElement('span');
  2373. price_info.appendChild(buy_price);
  2374. price_info.appendChild(sell_price);
  2375. buy_price.style.color = 'red';
  2376. sell_price.style.color = 'lime';
  2377.  
  2378. leftContainer.appendChild(price_info);
  2379.  
  2380. let lastWidth;
  2381. let lastHeight;
  2382. btn_close.onclick = toggle;
  2383. function toggle() {
  2384. if (wrapper.style.display === 'none') {
  2385. wrapper.style.display = ctx.style.display = 'block';
  2386. container.style.resize = "both";
  2387. btn_close.value = '📈隐藏';
  2388. leftContainer.style.position = 'absolute'
  2389. leftContainer.style.top = '1px';
  2390. leftContainer.style.left = '1px';
  2391. container.style.width = lastWidth;
  2392. container.style.height = lastHeight;
  2393. config.visible = true;
  2394. save_config();
  2395. } else {
  2396. lastWidth = container.style.width;
  2397. lastHeight = container.style.height;
  2398. wrapper.style.display = ctx.style.display = 'none';
  2399. container.style.resize = "none";
  2400. container.style.width = "auto";
  2401. container.style.height = "auto";
  2402.  
  2403.  
  2404. btn_close.value = '📈显示';
  2405. leftContainer.style.position = 'relative'
  2406. leftContainer.style.top = 0;
  2407. leftContainer.style.left = 0;
  2408.  
  2409. config.visible = false;
  2410. save_config();
  2411. }
  2412. };
  2413.  
  2414. let chart = new Chart(ctx, {
  2415. type: 'line',
  2416. data: {
  2417. labels: [],
  2418. datasets: []
  2419. },
  2420. options: {
  2421. onClick: save_config,
  2422. responsive: true,
  2423. maintainAspectRatio: false,
  2424. pointRadius: 0,
  2425. pointHitRadius: 20,
  2426. scales: {
  2427. x: {
  2428. type: 'time',
  2429. time: {
  2430. displayFormats: {
  2431. hour: 'HH:mm',
  2432. day: 'MM/dd'
  2433. }
  2434. },
  2435. title: {
  2436. display: false
  2437. },
  2438. grid: {
  2439. color: "rgba(255,255,255,0.2)"
  2440. },
  2441. ticks: {
  2442. color: "#e7e7e7"
  2443. }
  2444. },
  2445. y: {
  2446. beginAtZero: false,
  2447. title: {
  2448. display: false,
  2449. color: "white",
  2450. },
  2451. grid: {
  2452. color: "rgba(255,255,255,0.2)",
  2453. },
  2454. ticks: {
  2455. color: "#e7e7e7",
  2456. // 自定义刻度标签格式化
  2457. callback: showNumber
  2458. }
  2459. }
  2460. },
  2461. plugins: {
  2462. tooltip: { mode: 'index', intersect: false, bodyColor: "#e7e7e7", titleColor: "#e7e7e7" },
  2463. crosshair: {
  2464. line: { color: '#AAAAAA', width: 1 },
  2465. zoom: { enabled: false }
  2466. },
  2467. title: {
  2468. display: true,
  2469. text: "",
  2470. color: "#e7e7e7",
  2471. font: {
  2472. size: 15,
  2473. weight: 'bold',
  2474. }
  2475. },
  2476. legend: {
  2477. display: true,
  2478. labels: {
  2479. color: "#e7e7e7"
  2480. }
  2481. },
  2482. }
  2483. }
  2484. });
  2485.  
  2486. function requestItemPrice(itemHridName, day = 1, level = 0) {
  2487. if (!itemHridName) return;
  2488. if (curHridName === itemHridName && curLevel === level && cur_day === day) return;//防止重复请求
  2489.  
  2490. curHridName = itemHridName;
  2491. curLevel = level;
  2492. cur_day = day;
  2493.  
  2494. curShowItemName = mwi.isZh ? mwi.lang.zh.translation.itemNames[itemHridName] : mwi.lang.en.translation.itemNames[itemHridName];
  2495. curShowItemName += curLevel > 0 ? `(+${curLevel})` : "";
  2496.  
  2497. let time = day * 3600 * 24;
  2498. //const HOST = "https://mooket.qi-e.top";上面定义了
  2499. if (curLevel > 0 || day < 2) {
  2500. const params = new URLSearchParams();
  2501. params.append("name", curHridName);
  2502. params.append("level", curLevel);
  2503. params.append("time", time);
  2504. fetch(`${HOST}/market/item/history?${params}`).then(res => {
  2505. res.json().then(data => updateChart(data, cur_day));
  2506. })
  2507. }//新api
  2508. else {//旧api
  2509. let itemNameEN = mwi.lang.en.translation.itemNames[itemHridName];
  2510. fetch(`${HOST}/market`, {
  2511. method: "POST",
  2512. headers: {
  2513. "Content-Type": "application/json",
  2514. },
  2515. body: JSON.stringify({
  2516. name: itemNameEN,
  2517. time: time
  2518. })
  2519. }).then(res => {
  2520. res.json().then(data => updateChart(data, cur_day));
  2521. })
  2522. }
  2523. }
  2524.  
  2525. function formatTime(timestamp, range) {
  2526. const date = new Date(timestamp * 1000);
  2527. const pad = n => n.toString().padStart(2, '0');
  2528.  
  2529. // 获取各时间组件
  2530. const hours = pad(date.getHours());
  2531. const minutes = pad(date.getMinutes());
  2532. const day = pad(date.getDate());
  2533. const month = pad(date.getMonth() + 1);
  2534. const shortYear = date.getFullYear().toString().slice(-2);
  2535.  
  2536. // 根据时间范围选择格式
  2537. switch (parseInt(range)) {
  2538. case 1: // 1天:只显示时间
  2539. return `${hours}:${minutes}`;
  2540.  
  2541. case 3: // 3天:日+时段
  2542. return `${hours}:${minutes}`;
  2543.  
  2544. case 7: // 7天:月/日 + 时段
  2545. return `${day}.${hours}`;
  2546. case 14: // 14天:月/日 + 时段
  2547. return `${day}.${hours}`;
  2548. case 30: // 30天:月/日
  2549. return `${month}/${day}`;
  2550.  
  2551. default: // 180天:年/月
  2552. return `${shortYear}/${month}`;
  2553. }
  2554. }
  2555.  
  2556. function showNumber(num) {
  2557. if (isNaN(num)) return num;
  2558. if (num === 0) return "0"; // 单独处理0的情况
  2559.  
  2560. const absNum = Math.abs(num);
  2561.  
  2562. //num保留一位小数
  2563. if (num < 1) return num.toFixed(2);
  2564.  
  2565. return absNum >= 1e10 ? `${(num / 1e9).toFixed(1)}B` :
  2566. absNum >= 1e7 ? `${(num / 1e6).toFixed(1)}M` :
  2567. absNum >= 1e5 ? `${Math.floor(num / 1e3)}K` :
  2568. `${Math.floor(num)}`;
  2569. }
  2570. //data={'bid':[{time:1,price:1}],'ask':[{time:1,price:1}]}
  2571. function updateChart(data, day) {
  2572. //字段名差异
  2573. data.bid = data.bid || data.bids
  2574. data.ask = data.ask || data.asks;
  2575. //过滤异常元素
  2576. for (let i = data.bid.length - 1; i >= 0; i--) {
  2577. if (data.bid[i].price < 0 && data.ask[i].price < 0) {//都小于0,认为是异常数据,直接删除
  2578. data.bid.splice(i, 1);
  2579. data.ask.splice(i, 1);
  2580. } else {//小于0则设置为0
  2581. data.bid[i].price = Math.max(0, data.bid[i].price);
  2582. data.ask[i].price = Math.max(0, data.ask[i].price);
  2583. }
  2584. }
  2585.  
  2586. //timestamp转日期时间
  2587. //根据day输出不同的时间表示,<3天显示时分,<=7天显示日时,<=30天显示月日,>30天显示年月
  2588.  
  2589. //显示历史价格
  2590. let enhancementLevel = document.querySelector(".MarketplacePanel_infoContainer__2mCnh .Item_enhancementLevel__19g-e")?.textContent.replace("+", "") || "0";
  2591. let tradeName = curHridName + "_" + parseInt(enhancementLevel);
  2592. if (trade_history[tradeName]) {
  2593. let buy = trade_history[tradeName].buy || "无记录";
  2594. let sell = trade_history[tradeName].sell || "无记录";
  2595. price_info.style.display = "inline-block";
  2596. let levelStr = enhancementLevel > 0 ? `<span style="color:orange">(+${enhancementLevel})</span>` : "";
  2597. price_info.innerHTML = `<span style="color:red">${showNumber(buy)}</span><span style="color:#AAAAAA">/</span><span style="color:lime">${showNumber(sell)}</span>${levelStr}`;
  2598. container.style.minWidth = price_info.clientWidth + 70 + "px";
  2599.  
  2600. } else {
  2601. price_info.style.display = "none";
  2602. container.style.minWidth = "68px";
  2603. }
  2604.  
  2605. const labels = data.bid.map(x => new Date(x.time * 1000));
  2606. chart.data.labels = labels;
  2607.  
  2608. let sma = [];
  2609. let sma_size = 6;
  2610. let sma_window = [];
  2611. for (let i = 0; i < data.bid.length; i++) {
  2612. sma_window.push((data.bid[i].price + data.ask[i].price) / 2);
  2613. if (sma_window.length > sma_size) sma_window.shift();
  2614. sma.push(sma_window.reduce((a, b) => a + b, 0) / sma_window.length);
  2615. }
  2616. chart.options.plugins.title.text = curShowItemName;
  2617. chart.data.datasets = [
  2618. {
  2619. label: mwi.isZh ? '买一' : "bid1",
  2620. data: data.bid.map(x => x.price),
  2621. borderColor: '#ff3300',
  2622. backgroundColor: '#ff3300',
  2623. borderWidth: 1.5
  2624. },
  2625. {
  2626. label: mwi.isZh ? '卖一' : "ask1",
  2627. data: data.ask.map(x => x.price),
  2628. borderColor: '#00cc00',
  2629. backgroundColor: '#00cc00',
  2630. borderWidth: 1.5
  2631. },
  2632. {
  2633. label: mwi.isZh ? '均线' : "mean",
  2634. data: sma,
  2635. borderColor: '#ff9900',
  2636. borderWidth: 3,
  2637. tension: 0.5,
  2638. fill: true
  2639. },
  2640.  
  2641. ];
  2642. let timeUnit, timeFormat;
  2643. if (day <= 3) {
  2644. timeUnit = 'hour';
  2645. timeFormat = 'HH:mm';
  2646. } else {
  2647. timeUnit = 'day';
  2648. timeFormat = 'MM/dd';
  2649. }
  2650. chart.options.scales.x.time.unit = timeUnit;
  2651. chart.options.scales.x.time.tooltipFormat = timeFormat;
  2652.  
  2653.  
  2654. chart.setDatasetVisibility(0, config.filter.ask);
  2655. chart.setDatasetVisibility(1, config.filter.bid);
  2656. chart.setDatasetVisibility(2, config.filter.mean);
  2657.  
  2658. chart.update()
  2659. }
  2660. function save_config() {
  2661.  
  2662. if (chart && chart.data && chart.data.datasets && chart.data.datasets.length == 3) {
  2663. config.filter.ask = chart.getDatasetMeta(0).visible;
  2664. config.filter.bid = chart.getDatasetMeta(1).visible;
  2665. config.filter.mean = chart.getDatasetMeta(2).visible;
  2666. }
  2667. config.x = Math.max(0, Math.min(container.getBoundingClientRect().x, window.innerWidth - 50));
  2668. config.y = Math.max(0, Math.min(container.getBoundingClientRect().y, window.innerHeight - 50));
  2669. if (container.style.width != "auto") {
  2670. config.w = container.clientWidth;
  2671. config.h = container.clientHeight;
  2672. }
  2673.  
  2674. localStorage.setItem("mooket_config", JSON.stringify(config));
  2675. }
  2676. setInterval(() => {
  2677. if (document.querySelector(".MarketplacePanel_marketplacePanel__21b7o")?.checkVisibility()) {
  2678. container.style.display = "block"
  2679. try {
  2680. let currentItem = document.querySelector(".MarketplacePanel_currentItem__3ercC");
  2681. let level = currentItem?.querySelector(".Item_enhancementLevel__19g-e");
  2682. let itemHrid = mwi.ensureItemHrid(currentItem?.querySelector(".Icon_icon__2LtL_")?.ariaLabel);
  2683. requestItemPrice(itemHrid, cur_day, parseInt(level?.textContent.replace("+", "") || "0"))
  2684. } catch (e) {
  2685. console.error(e)
  2686. }
  2687. } else {
  2688. container.style.display = "none"
  2689. }
  2690. }, 500);
  2691. //setInterval(updateInventoryStatus, 60000);
  2692. toggle();
  2693. console.info("mooket 初始化完成");
  2694. }
  2695. new Promise(resolve => {
  2696. let count = 0;
  2697. const interval = setInterval(() => {
  2698. count++;
  2699. if (count > 30) { clearInterval(interval) }//最多等待30秒
  2700. if (document.body) {//等待必须组件加载完毕后再初始化
  2701. clearInterval(interval);
  2702. resolve();
  2703. }
  2704. }, 1000);
  2705. }).then(() => {
  2706. mooket();
  2707. });
  2708.  
  2709. })();