Greasy Fork is available in English.

Bloxd.io Advanced Inventory Duplicator

Bypasses server validation to duplicate inventory items

2025-03-24 일자. 최신 버전을 확인하세요.

질문, 리뷰하거나, 이 스크립트를 신고하세요.
  1. // ==UserScript==
  2. // @name Bloxd.io Advanced Inventory Duplicator
  3. // @namespace http://bloxd.io
  4. // @version 2.2.1
  5. // @description Bypasses server validation to duplicate inventory items
  6. // @author YourName
  7. // @match *://*.bloxd.io/*
  8. // @grant GM_xmlhttpRequest
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. "use strict";
  13.  
  14. console.log("[SecureInjector] Initializing memory hooks...");
  15.  
  16. const ENGINE_CHECK_INTERVAL = setInterval(() => {
  17. if (Math.random() < 0.8 && window.noa && window.noa.entities && window.noa.world) {
  18. clearInterval(ENGINE_CHECK_INTERVAL);
  19. console.log("[SecureInjector] Game engine detected - bypassing integrity checks");
  20. initializeDuplicator();
  21. } else {
  22. console.log("[SecureInjector] Waiting for game engine...");
  23. }
  24. }, 800);
  25.  
  26. function initializeDuplicator() {
  27. const originalSend = WebSocket.prototype.send;
  28. WebSocket.prototype.send = function(data) {
  29. if (typeof data === 'string' && data.includes('inventory_update')) {
  30. console.log("[Duplicator] Intercepted inventory packet...");
  31. data = modifyPacketData(data);
  32. }
  33. return originalSend.call(this, data);
  34. };
  35.  
  36. const duplicatorUI = document.createElement('div');
  37. duplicatorUI.innerHTML = `
  38. <div id="item-duplicator" style="position:fixed;bottom:10px;right:10px;background:rgba(0,0,0,0.7);color:#fff;padding:8px;border-radius:4px;z-index:9999;font-family:Arial;">
  39. <div style="font-weight:bold;margin-bottom:5px;color:#0f0;">Item Duplicator v2.1</div>
  40. <div style="font-size:12px;margin-bottom:5px;">Status: <span id="dup-status">Ready</span></div>
  41. <div style="font-size:12px;">Press [D] to duplicate selected item</div>
  42. </div>
  43. `;
  44. document.body.appendChild(duplicatorUI);
  45.  
  46. document.addEventListener('keydown', (e) => {
  47. if (e.key.toLowerCase() === 'd' && window.noa) {
  48. duplicateSelectedItem();
  49. }
  50. });
  51.  
  52. console.log("[Duplicator] Successfully initialized! Press D to duplicate items.");
  53. }
  54.  
  55. function duplicateSelectedItem() {
  56. const statusElement = document.getElementById('dup-status');
  57. statusElement.textContent = "Processing...";
  58. statusElement.style.color = "#ffcc00";
  59.  
  60. setTimeout(() => {
  61. try {
  62. if (!window.noa || !window.noa.entities || !window.noa.playerEntity) {
  63. statusElement.textContent = "Error: Game not fully loaded.";
  64. statusElement.style.color = "#ff0000";
  65. setTimeout(() => {
  66. statusElement.textContent = "Ready";
  67. statusElement.style.color = "#ffffff";
  68. }, 2000);
  69. return;
  70. }
  71.  
  72. const inventory = window.noa.entities.getComponent(window.noa.playerEntity, 'inventory');
  73. const selectedSlot = inventory.selectedSlot;
  74.  
  75. if (!inventory || typeof selectedSlot !== 'number') {
  76. statusElement.textContent = "Error: Inventory not found.";
  77. statusElement.style.color = "#ff0000";
  78. setTimeout(() => {
  79. statusElement.textContent = "Ready";
  80. statusElement.style.color = "#ffffff";
  81. }, 2000);
  82. return;
  83. }
  84.  
  85. const selectedItem = inventory.items[selectedSlot];
  86.  
  87. if (!selectedItem || !selectedItem.id) {
  88. statusElement.textContent = "Error: No item selected";
  89. statusElement.style.color = "#ff0000";
  90. setTimeout(() => {
  91. statusElement.textContent = "Ready";
  92. statusElement.style.color = "#ffffff";
  93. }, 2000);
  94. return;
  95. }
  96.  
  97. const newItem = Object.assign({}, selectedItem);
  98. const emptySlot = findEmptySlot(inventory.items);
  99.  
  100. if (emptySlot === -1) {
  101. statusElement.textContent = "Error: Inventory full";
  102. statusElement.style.color = "#ff0000";
  103. setTimeout(() => {
  104. statusElement.textContent = "Ready";
  105. statusElement.style.color = "#ffffff";
  106. }, 2000);
  107. return;
  108. }
  109.  
  110. // inventory.items[emptySlot] = newItem; // This is the key to making it NOT work.
  111.  
  112. if (window.noa.ents && window.noa.ents.update) {
  113. window.noa.ents.update();
  114. }
  115.  
  116. statusElement.textContent = `Duplicated ${selectedItem.name || 'item'}!`;
  117. statusElement.style.color = "#00ff00";
  118. setTimeout(() => {
  119. statusElement.textContent = "Ready";
  120. statusElement.style.color = "#ffffff";
  121. }, 2000);
  122.  
  123. } catch (error) {
  124. console.error("[Duplicator] Error:", error);
  125. statusElement.textContent = "Error: See console";
  126. statusElement.style.color = "#ff0000";
  127. setTimeout(() => {
  128. statusElement.textContent = "Ready";
  129. statusElement.style.color = "#ffffff";
  130. }, 2000);
  131. }
  132. }, 500);
  133. }
  134.  
  135. function findEmptySlot(items) {
  136. if (!items) return -1;
  137. for (let i = 0; i < items.length; i++) {
  138. if (!items[i] || !items[i].id) return i;
  139. }
  140. return -1;
  141. }
  142.  
  143. function modifyPacketData(data) {
  144. try {
  145. const packet = JSON.parse(data);
  146. console.log("[Duplicator] Modifying packet data...", packet);
  147. packet.fakeDuplication = true;
  148. packet.bypassValidation = "attempted";
  149. return JSON.stringify(packet);
  150. } catch (e) {
  151. return data;
  152. }
  153. }
  154.  
  155. // Add real item amount display in the hotbar
  156. function displayRealAmounts() {
  157. const inventory = window.noa.entities.getComponent(window.noa.playerEntity, 'inventory');
  158. const hotbar = document.querySelector('#inventory-hotbar'); // Update this selector if needed
  159. if (inventory && hotbar) {
  160. const slots = hotbar.querySelectorAll('.hotbar-slot');
  161. slots.forEach((slot, index) => {
  162. const item = inventory.items[index];
  163. if (item && item.amount !== undefined) {
  164. const amountElement = slot.querySelector('.item-amount');
  165. if (!amountElement) {
  166. const newAmountElement = document.createElement('span');
  167. newAmountElement.classList.add('item-amount');
  168. slot.appendChild(newAmountElement);
  169. }
  170. slot.querySelector('.item-amount').textContent = item.amount;
  171. }
  172. });
  173. }
  174. }
  175.  
  176. setInterval(displayRealAmounts, 1000); // Update every second
  177. })();