mooket

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

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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址