🐭️ MouseHunt - Item Links

Adds a drop rate table from MHCT, links to the MouseHunt wiki, MHCT looter, and Markethunt, as well as various other features to the item view page.

安装此脚本?
作者推荐脚本

您可能也喜欢🐭️ MouseHunt - Better Mice

安装此脚本
  1. // ==UserScript==
  2. // @name 🐭️ MouseHunt - Item Links
  3. // @description Adds a drop rate table from MHCT, links to the MouseHunt wiki, MHCT looter, and Markethunt, as well as various other features to the item view page.
  4. // @version 2.1.0
  5. // @license MIT
  6. // @author bradp
  7. // @namespace bradp
  8. // @match https://www.mousehuntgame.com/*
  9. // @icon https://i.mouse.rip/mh-improved/icon-64.png
  10. // @run-at document-end
  11. // @grant none
  12. // @require https://cdn.jsdelivr.net/npm/script-migration@1.1.1
  13. // ==/UserScript==
  14.  
  15. var mhui = (() => {
  16. var __defProp = Object.defineProperty;
  17. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  18. var __getOwnPropNames = Object.getOwnPropertyNames;
  19. var __hasOwnProp = Object.prototype.hasOwnProperty;
  20. var __export = (target, all) => {
  21. for (var name in all)
  22. __defProp(target, name, { get: all[name], enumerable: true });
  23. };
  24. var __copyProps = (to, from, except, desc) => {
  25. if (from && typeof from === "object" || typeof from === "function") {
  26. for (let key of __getOwnPropNames(from))
  27. if (!__hasOwnProp.call(to, key) && key !== except)
  28. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  29. }
  30. return to;
  31. };
  32. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  33. var __async = (__this, __arguments, generator) => {
  34. return new Promise((resolve, reject) => {
  35. var fulfilled = (value) => {
  36. try {
  37. step(generator.next(value));
  38. } catch (e) {
  39. reject(e);
  40. }
  41. };
  42. var rejected = (value) => {
  43. try {
  44. step(generator.throw(value));
  45. } catch (e) {
  46. reject(e);
  47. }
  48. };
  49. var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
  50. step((generator = generator.apply(__this, __arguments)).next());
  51. });
  52. };
  53.  
  54. // src/modules/better-item-view/index.js
  55. var better_item_view_exports = {};
  56. __export(better_item_view_exports, {
  57. default: () => better_item_view_default
  58. });
  59.  
  60. // src/utils/event-registry.js
  61. var eventsAdded = {};
  62. var onEvent = (event, callback, remove = false) => {
  63. if (!eventRegistry) {
  64. return;
  65. }
  66. const id = `${event}-${remove.toString()}-${callback.toString()}`;
  67. if (eventsAdded[id]) {
  68. return;
  69. }
  70. eventsAdded[id] = true;
  71. eventRegistry.addEventListener(event, callback, null, remove);
  72. };
  73.  
  74. // src/utils/styles.js
  75. var addModuleStyles = (styles, identifier = "mh-improved-styles", replace = false) => {
  76. const existingStyles = document.querySelector(`#${identifier}`);
  77. styles = Array.isArray(styles) ? styles.join("\n") : styles;
  78. if (existingStyles) {
  79. if (replace) {
  80. existingStyles.innerHTML = styles;
  81. } else {
  82. existingStyles.innerHTML += styles;
  83. }
  84. return existingStyles;
  85. }
  86. const style = document.createElement("style");
  87. style.id = identifier;
  88. style.innerHTML = styles;
  89. document.head.append(style);
  90. return style;
  91. };
  92. var addStyles = (styles, module = false, identifier = "mh-improved-styles") => {
  93. if (!module) {
  94. throw new Error("Module ID is required for adding module styles.", module);
  95. }
  96. const key = `${identifier}-${module}`;
  97. let stylesEl = addModuleStyles(styles, key, true);
  98. onEvent(`mh-improved-settings-changed-${module}`, (enabled) => {
  99. if (enabled) {
  100. stylesEl = addModuleStyles(styles, key, true);
  101. } else if (stylesEl) {
  102. stylesEl.remove();
  103. }
  104. });
  105. };
  106.  
  107. // src/utils/settings.js
  108. var getSettingDirect = (key = null, defaultValue = null, identifier = "mousehunt-improved-settings") => {
  109. const settings = JSON.parse(localStorage.getItem(identifier)) || {};
  110. if (!key) {
  111. return settings;
  112. }
  113. if (!key.includes(".")) {
  114. if (settings[key] === void 0) {
  115. return defaultValue;
  116. }
  117. return settings[key];
  118. }
  119. const groupAndKey = getGroupAndKey(key);
  120. if (!groupAndKey.group) {
  121. if (settings[groupAndKey.key] === void 0) {
  122. return defaultValue;
  123. }
  124. return settings[groupAndKey.key];
  125. }
  126. const groupSettings = settings[groupAndKey.group] || {};
  127. if (groupSettings[groupAndKey.key] === void 0) {
  128. return defaultValue;
  129. }
  130. return groupSettings[groupAndKey.key];
  131. };
  132. var getGroupAndKey = (key) => {
  133. const split = key.split(".");
  134. if (split.length === 1) {
  135. return {
  136. group: null,
  137. key: split[0]
  138. };
  139. }
  140. if (split[0] === "location-huds-enabled") {
  141. return {
  142. group: "location-huds-enabled",
  143. key: split[1]
  144. };
  145. }
  146. return {
  147. group: `${split[0]}-settings`,
  148. key: split[1]
  149. };
  150. };
  151. var getSetting = (key, defaultValue = false) => {
  152. return getSettingDirect(key, defaultValue, "mousehunt-improved-settings");
  153. };
  154.  
  155. // src/utils/elements.js
  156. var makeElement = (tag, classes = "", text = "", appendTo = null) => {
  157. const element = document.createElement(tag);
  158. if (Array.isArray(classes)) {
  159. classes = classes.join(" ");
  160. }
  161. if (classes && classes.length) {
  162. element.className = classes;
  163. }
  164. element.innerHTML = text;
  165. if (appendTo) {
  166. appendTo.append(element);
  167. return appendTo;
  168. }
  169. return element;
  170. };
  171. var makeLink = (text, href, encodeAsSpace = false) => {
  172. if (encodeAsSpace) {
  173. href = href.replaceAll("_", "%20");
  174. }
  175. return `<a href="${href}" target="_mouse" class="mousehuntActionButton tiny"><span>${text}</span></a>`;
  176. };
  177. var makeTooltip = (options) => {
  178. if (!options.appendTo) {
  179. return false;
  180. }
  181. const { appendTo, className = "", text = "" } = options;
  182. const tooltip = makeElement("div", ["PreferencesPage__blackTooltip", "mh-improved-tooltip", className]);
  183. makeElement("span", "PreferencesPage__blackTooltipText", text, tooltip);
  184. appendTo.append(tooltip);
  185. return tooltip;
  186. };
  187.  
  188. // src/utils/db.js
  189. var database = (databaseName) => __async(void 0, null, function* () {
  190. return new Promise((resolve, reject) => {
  191. const request = indexedDB.open(`mh-improved-${databaseName}`, 6);
  192. request.onerror = (event) => {
  193. reject(event.target.error);
  194. };
  195. request.onsuccess = (event) => {
  196. resolve(event.target.result);
  197. };
  198. request.onupgradeneeded = (event) => {
  199. const db = event.target.result;
  200. if (!db.objectStoreNames.contains(databaseName)) {
  201. db.createObjectStore(databaseName, { keyPath: "id" });
  202. }
  203. };
  204. });
  205. });
  206. var dbGet = (databaseName, id) => __async(void 0, null, function* () {
  207. const db = yield database(databaseName);
  208. const transaction = db.transaction(databaseName, "readonly");
  209. transaction.onerror = (event) => {
  210. throw new Error(event.target.error);
  211. };
  212. const objectStore = transaction.objectStore(databaseName);
  213. const request = objectStore.get(id);
  214. return new Promise((resolve, reject) => {
  215. request.onsuccess = () => {
  216. resolve(request.result);
  217. };
  218. request.onerror = () => {
  219. reject(request.error);
  220. };
  221. transaction.oncomplete = () => {
  222. db.close();
  223. };
  224. });
  225. });
  226. var dbSet = (databaseName, data) => __async(void 0, null, function* () {
  227. const db = yield database(databaseName);
  228. const transaction = db.transaction(databaseName, "readwrite");
  229. const objectStore = transaction.objectStore(databaseName);
  230. data = {
  231. data,
  232. id: data.id || Date.now()
  233. };
  234. const request = objectStore.put(data);
  235. return new Promise((resolve, reject) => {
  236. request.onsuccess = () => {
  237. resolve(request.result);
  238. };
  239. request.onerror = () => {
  240. reject(request.error);
  241. };
  242. transaction.oncomplete = () => {
  243. db.close();
  244. };
  245. });
  246. });
  247.  
  248. // src/utils/global.js
  249. var getGlobal = (key) => {
  250. if (window && window.mhui) {
  251. return window.mhui[key] || false;
  252. }
  253. if ("undefined" !== typeof app && app && app.mhui) {
  254. return app.mhui[key] || false;
  255. }
  256. return false;
  257. };
  258.  
  259. // src/utils/data.js
  260. var getHeaders = () => {
  261. return {
  262. "Content-Type": "application/json",
  263. "X-MH-Improved": "true",
  264. "X-MH-Improved-Version": mhImprovedVersion || "unknown",
  265. "X-MH-Improved-Platform": mhImprovedPlatform || "unknown"
  266. };
  267. };
  268.  
  269. // src/utils/events.js
  270. var runCallbacks = (settings, parentNode, callbacks) => {
  271. Object.keys(settings).forEach((key) => {
  272. if (parentNode && parentNode.classList && parentNode.classList.contains(settings[key].selector)) {
  273. settings[key].isVisible = true;
  274. if (callbacks[key] && callbacks[key].show) {
  275. callbacks[key].show();
  276. }
  277. } else if (settings[key].isVisible) {
  278. settings[key].isVisible = false;
  279. if (callbacks[key] && callbacks[key].hide) {
  280. callbacks[key].hide();
  281. }
  282. }
  283. });
  284. return settings;
  285. };
  286. var overlayMutationObserver = null;
  287. var overlayCallbacks = [];
  288. var onOverlayChange = (callbacks) => {
  289. let overlayData = {
  290. map: {
  291. isVisible: false,
  292. selector: "treasureMapPopup"
  293. },
  294. item: {
  295. isVisible: false,
  296. selector: "itemViewPopup"
  297. },
  298. mouse: {
  299. isVisible: false,
  300. selector: "mouseViewPopup"
  301. },
  302. image: {
  303. isVisible: false,
  304. selector: "largerImage"
  305. },
  306. convertible: {
  307. isVisible: false,
  308. selector: "convertibleOpenViewPopup"
  309. },
  310. adventureBook: {
  311. isVisible: false,
  312. selector: "adventureBookPopup"
  313. },
  314. marketplace: {
  315. isVisible: false,
  316. selector: "marketplaceViewPopup"
  317. },
  318. gifts: {
  319. isVisible: false,
  320. selector: "giftSelectorViewPopup"
  321. },
  322. support: {
  323. isVisible: false,
  324. selector: "supportPageContactUsForm"
  325. },
  326. premiumShop: {
  327. isVisible: false,
  328. selector: "MHCheckout"
  329. }
  330. };
  331. overlayCallbacks.push(callbacks);
  332. if (overlayMutationObserver) {
  333. return;
  334. }
  335. overlayMutationObserver = true;
  336. const observer = new MutationObserver(() => {
  337. overlayCallbacks.forEach((callback) => {
  338. if (callback.change) {
  339. callback.change();
  340. }
  341. const overlayType = document.querySelector("#overlayPopup");
  342. if (overlayType && overlayType.classList.length <= 0) {
  343. return;
  344. }
  345. const overlayBg = document.querySelector("#overlayBg");
  346. if (overlayBg && overlayBg.classList.length > 0) {
  347. if (callback.show) {
  348. callback.show();
  349. }
  350. } else if (callback.hide) {
  351. callback.hide();
  352. }
  353. overlayData = runCallbacks(overlayData, overlayType, callback);
  354. });
  355. });
  356. const observeTarget = document.querySelector("#overlayPopup");
  357. if (observeTarget) {
  358. observer.observe(observeTarget, {
  359. attributes: true,
  360. attributeFilter: ["class"]
  361. });
  362. }
  363. };
  364.  
  365. // src/utils/maps.js
  366. var mapper = (key = false) => {
  367. if (key) {
  368. const mapperData = getGlobal("mapper");
  369. if (!mapperData || !mapperData[key]) {
  370. return false;
  371. }
  372. return mapperData[key];
  373. }
  374. return getGlobal("mapper");
  375. };
  376. var mapData = () => {
  377. const m = mapper();
  378. if (!m) {
  379. return {};
  380. }
  381. return m.mapData;
  382. };
  383. var getCachedValue = (key) => __async(void 0, null, function* () {
  384. var _a;
  385. const value = yield dbGet("ar-cache", key);
  386. if (!((_a = value == null ? void 0 : value.data) == null ? void 0 : _a.value)) {
  387. return null;
  388. }
  389. return value.data.value;
  390. });
  391. var setCachedValue = (key, value) => __async(void 0, null, function* () {
  392. yield dbSet("ar-cache", { id: key, value });
  393. });
  394. var getArForMouse = (id, type = "mouse") => __async(void 0, null, function* () {
  395. let mhctJson = [];
  396. const cacheKey = `${type}-${id}`;
  397. const cachedAr = yield getCachedValue(cacheKey);
  398. if (cachedAr) {
  399. return cachedAr;
  400. }
  401. const isItem = "item" === type;
  402. const mhctPath = isItem ? "mhct-item" : "mhct";
  403. let mhctData = [];
  404. const data = mapData() || {};
  405. const mapType = (data == null ? void 0 : data.map_type) || "";
  406. let url = `https://api.mouse.rip/${mhctPath}/${id}`;
  407. if (mapType.toLowerCase().includes("halloween")) {
  408. url = `https://api.mouse.rip/${mhctPath}/${id}-hlw_22`;
  409. }
  410. try {
  411. mhctData = yield fetch(url, { headers: getHeaders() });
  412. } catch (error) {
  413. console.error("Error fetching MHCT data:", error);
  414. yield new Promise((resolve) => setTimeout(resolve, 500));
  415. try {
  416. mhctData = yield fetch(url, { headers: getHeaders() });
  417. } catch (errorRetry) {
  418. console.error("Error fetching MHCT data:", errorRetry);
  419. return [];
  420. }
  421. }
  422. if (!mhctData.ok) {
  423. return [];
  424. }
  425. mhctJson = yield mhctData.json();
  426. if (!mhctJson || mhctJson.length === 0) {
  427. return [];
  428. }
  429. if (isItem) {
  430. for (const rate of mhctJson) {
  431. rate.rate = Number.parseInt(rate.drop_pct * 100);
  432. delete rate.drop_ct;
  433. }
  434. }
  435. if (mhctJson.error) {
  436. return [];
  437. }
  438. mhctJson = mhctJson.filter((rate) => {
  439. if (rate.rate === 0) {
  440. return false;
  441. }
  442. if (rate.rate === 9999) {
  443. rate.rate = 1e4;
  444. }
  445. return true;
  446. });
  447. yield setCachedValue(cacheKey, mhctJson);
  448. return mhctJson;
  449. });
  450.  
  451. // src/utils/messages.js
  452. hadAddedErrorStyles = false;
  453.  
  454. // src/modules/better-item-view/settings/index.js
  455. var settings_default = () => __async(void 0, null, function* () {
  456. return [
  457. {
  458. id: "better-item-view.show-drop-rates",
  459. title: "Show drop rates",
  460. default: true
  461. },
  462. {
  463. id: "better-item-view.show-item-hover",
  464. title: "Show item details on hover (in journal)",
  465. default: true
  466. }
  467. ];
  468. });
  469.  
  470. // src/modules/better-item-view/styles.css
  471. var styles_default = '.itemView-titleContainer{height:26px}.itemView-header-name{display:flex;align-items:center;justify-content:space-between}.mh-item-links{display:flex;justify-content:flex-end;margin-right:-10px}.mh-item-links a{margin-right:5px}.itemView-header-name .mh-item-links span{display:inline-block;font-size:11px;font-weight:400}.itemView-has-mhct .mouse-ar-wrapper{display:grid;grid-template-columns:150px auto 50px;place-items:center stretch;padding:5px;margin:5px 0;font-size:12px}.itemView-has-mhct .has-stages .mouse-ar-wrapper{grid-template-columns:110px 140px auto 50px}.itemView-has-mhct .mouse-ar-wrapper div{padding:0 2px}.itemView-has-mhct .mice-ar-wrapper{margin-right:10px}.mouse-ar-wrapper .stage{font-size:10px}.mouse-ar-wrapper .cheese{font-size:11px}.itemView-has-mhct .ar-header{display:flex;align-items:center;justify-content:space-between;height:26px;padding-bottom:2px;margin-top:10px;margin-bottom:10px;font-size:12px;font-weight:900;border-bottom:1px solid #ccc}.itemView-has-mhct .ar-link{font-size:9px}.itemView-has-mhct .rate{text-align:right}.itemView-has-mhct .mouse-ar-wrapper:nth-child(odd){background-color:#e7e7e7}.itemView-has-mhct .itemView-description{font-weight:500;line-height:19px}.itemView-action.crafting_item b{display:none}.itemView-action.crafting_item:before{content:"This can be used to craft other items!"}.itemViewContainer.map_piece .itemView-action-text.map_piece,.itemViewContainer.base .itemView-action-text.base,.itemViewContainer.weapon .itemView-actio-textn.weapon,.itemViewContainer.bait .itemView-action-text.bait,.itemViewContainer.trinket .itemView-action-text.trinket,.itemViewContainer.potion .itemView-action-text.potion,.itemViewContainer.readiness_item .itemView-action-text.readiness_item,.itemViewContainer.convertible .itemView-action-text.convertible,.itemViewContainer.torn_page .itemView-action-text.torn_page,.itemViewContainer.crafting_item .itemView-action-text.crafting_item,.itemViewContainer.collectible .itemView-action-text.collectible,.itemViewContainer.message_item .itemView-action-text.message_item,.itemViewContainer.bonus_loot .itemView-action-text.bonus_loot,.itemViewContainer.stat .itemView-action-text.stat,.itemViewContainer.quest .itemView-action-text.quest,.itemViewContainer.skin .itemView-action-text.skin{display:none!important}.itemViewContainer .shopCustomization .itemViewStatBlock-stat{display:flex;flex-direction:column;align-items:center}.itemViewContainer .itemViewStatBlock-stat{display:flex;flex-direction:row;align-items:center;justify-content:flex-start}.itemViewContainer .itemViewStatBlock-stat-value{flex:1;text-align:left}.itemViewContainer .itemViewStatBlock-stat.cheeseEffect{font-size:9px;text-align:center}.itemViewContainer .itemViewStatBlock.trinket .itemViewStatBlock-padding{display:flex;flex-direction:column;align-items:stretch;width:100px}.itemViewContainer .itemViewStatBlock.trinket{width:100px;font-size:13px}#overlayPopup.itemViewPopup #jsDialogClose{z-index:1}#overlayPopup.itemViewPopup .itemView-header-classification{right:25px}.itemView-actionContainer{display:flex;flex-wrap:wrap;gap:10px}.itemView-action{border-top:none}.itemViewContainer.potion .inventoryPage-item-recipeOptions li{width:365px}.itemView-character-image{width:auto;height:84px;margin-top:-15px;margin-left:-9px}.itemView-character-name{left:-11px;width:75px;font-size:15px}.itemView-padding{margin-left:70px}.itemView-thumbnail.large{margin-left:-15px}input.itemView-action-convert-quantity{width:50px}.itemViewPopup .itemViewStatBlock-padding{flex-direction:column}.itemView-character .itemView-character-image{transition:all .4s ease-out;transform-origin:bottom}.itemView-character:hover .itemView-character-image{transform:scale(1.2) rotate(-10deg) translate(5px)}.itemView-header-classification{visibility:hidden}.itemView-header-classification span{visibility:visible}.itemViewStatBlock-stat{display:flex;align-items:center}.itemView-sidebar-checklistItem:nth-child(1),.itemView-sidebar-checklistItem:nth-child(2),.itemView-sidebar-checklistItem.checked{display:block}.itemView-sidebar-checklistItem{background:url(https://www.mousehuntgame.com/images/icons/bad_idea.png) 1px 4px no-repeat;background-size:14px}.itemView-partsContainer{display:flex;flex-direction:column;align-items:stretch;padding-top:15px;padding-bottom:10px;margin-top:15px;border-top:1px solid #666}\n';
  472.  
  473. // src/modules/better-item-view/index.js
  474. var getLinkMarkup = (name, id) => {
  475. return makeLink("MHCT", `https://www.mhct.win/loot.php?item=${id}`, true) + makeLink("Wiki", `https://mhwiki.hitgrab.com/wiki/index.php/${name}`);
  476. };
  477. var addLinks = (itemId) => {
  478. const title = document.querySelector(".itemView-header-name");
  479. if (!title) {
  480. return;
  481. }
  482. const currentLinks = document.querySelector(".mh-item-links");
  483. if (currentLinks) {
  484. currentLinks.remove();
  485. }
  486. const div = document.createElement("div");
  487. div.classList.add("mh-item-links");
  488. div.innerHTML = getLinkMarkup(title.innerText, itemId);
  489. title.append(div);
  490. const values = document.querySelector(".mouseView-values");
  491. const desc = document.querySelector(".mouseView-descriptionContainer");
  492. if (values && desc) {
  493. desc.insertBefore(values, desc.firstChild);
  494. }
  495. };
  496. var updateItemView = () => __async(void 0, null, function* () {
  497. const itemView = document.querySelector(".itemViewContainer");
  498. if (!itemView) {
  499. return;
  500. }
  501. const itemId = itemView.getAttribute("data-item-id");
  502. if (!itemId) {
  503. return;
  504. }
  505. const sidebar = document.querySelector(".itemView-sidebar");
  506. if (sidebar) {
  507. const crafting = document.querySelector(".itemView-action.crafting_item");
  508. if (crafting) {
  509. sidebar.append(crafting);
  510. }
  511. const smashing = document.querySelector(".itemView-partsContainer");
  512. if (smashing) {
  513. sidebar.append(smashing);
  514. if (smashing.getAttribute("data-has-changed-title")) {
  515. return;
  516. }
  517. const smashingTitle = smashing.querySelector("b");
  518. if (smashingTitle) {
  519. smashingTitle.innerText = "Hunter's Hammer to get:";
  520. smashing.setAttribute("data-has-changed-title", "true");
  521. smashing.innerHtml = smashing.innerHTML.replace("If you smash it, you'll get:", "");
  522. }
  523. }
  524. }
  525. addLinks(itemId);
  526. if (!getSetting("better-item-view.show-drop-rates", true)) {
  527. return;
  528. }
  529. const id = Number.parseInt(itemId, 10);
  530. const ignored = [
  531. 2473,
  532. // Mina's gift
  533. 823,
  534. // party charm
  535. 803,
  536. // chrome charm
  537. 420,
  538. // king's credits
  539. 1980,
  540. // king's keys
  541. 585
  542. // scrambles
  543. ];
  544. if (ignored.includes(id)) {
  545. return;
  546. }
  547. let mhctJson = yield getArForMouse(itemId, "item");
  548. if (!mhctJson || mhctJson === void 0) {
  549. return;
  550. }
  551. itemView.classList.add("mouseview-has-mhct");
  552. const container = itemView.querySelector(".itemView-padding");
  553. if (!container) {
  554. return;
  555. }
  556. const arWrapper = makeElement("div", "ar-wrapper");
  557. const title = makeElement("div", "ar-header");
  558. const titleText = makeElement("div", "ar-title", "Drop Rates", title);
  559. makeTooltip({
  560. appendTo: titleText,
  561. text: 'The best location and bait, according to data gathered by <a href="https://mhct.win/" target="_blank" rel="noopener noreferrer">MHCT</a>.'
  562. });
  563. const link = makeElement("a", "ar-link", "View on MHCT \u2192");
  564. link.href = `https://www.mhct.win/loot.php?item=${itemId}`;
  565. link.target = "_mhct";
  566. title.append(link);
  567. arWrapper.append(title);
  568. const itemsArWrapper = makeElement("div", "item-ar-wrapper");
  569. const hasStages = mhctJson.some((itemAr) => itemAr.stage);
  570. if (hasStages) {
  571. itemsArWrapper.classList.add("has-stages");
  572. }
  573. mhctJson = mhctJson.filter((itemAr) => Number.parseInt(itemAr.drop_pct, 10) > 0).slice(0, 10);
  574. mhctJson.forEach((itemAr) => {
  575. const dropPercent = Number.parseInt(itemAr.drop_pct, 10).toFixed(2);
  576. if (dropPercent !== "0.00") {
  577. const itemArWrapper = makeElement("div", "mouse-ar-wrapper");
  578. makeElement("div", "location", itemAr.location, itemArWrapper);
  579. if (hasStages) {
  580. makeElement("div", "stage", itemAr.stage, itemArWrapper);
  581. }
  582. makeElement("div", "cheese", itemAr.cheese, itemArWrapper);
  583. makeElement("div", "rate", `${dropPercent}%`, itemArWrapper);
  584. itemsArWrapper.append(itemArWrapper);
  585. }
  586. });
  587. if (mhctJson.length > 0) {
  588. arWrapper.append(itemsArWrapper);
  589. container.append(arWrapper);
  590. }
  591. });
  592. var init = () => __async(void 0, null, function* () {
  593. addStyles(styles_default, "better-item-view");
  594. if (getSetting("better-item-view.show-item-hover", true)) {
  595. }
  596. onOverlayChange({ item: { show: updateItemView } });
  597. });
  598. var better_item_view_default = {
  599. id: "better-item-view",
  600. name: "Better Item View",
  601. type: "better",
  602. default: true,
  603. description: "Updates the styles and shows drop rates, links to MHCT, and MH Wiki.",
  604. load: init,
  605. settings: settings_default
  606. };
  607. return __toCommonJS(better_item_view_exports);
  608. })();
  609. mhImprovedVersion = "0.0.0-userscript;"
  610. mhImprovedPlatform = "userscript";
  611. mhui.default.load();
  612. migrateUserscript('Item Links', 'https://greasyfork.org/en/scripts/445920-mousehunt-item-links');