Sploop.io Blatant Placement, auto-heal

just a basic macro

  1. // ==UserScript==
  2. // @name Sploop.io Blatant Placement, auto-heal
  3. // @version 1
  4. // @description just a basic macro
  5. // @author renato
  6. // @match *://sploop.io/*
  7. // @icon https://sploop.io/img/ui/favicon.png
  8. // @license MIT
  9. // @namespace https://greasyfork.org/users/1311498
  10. // ==/UserScript==
  11.  
  12.  
  13. let n = 0x1 / 0;
  14. let WTFF;
  15. const log = console.log;
  16. let adminhere = false;
  17.  
  18. function initialize(XITED) {
  19. WTFF = XITED;
  20. }
  21.  
  22. WebSocket.prototype.lastSend = WebSocket.prototype.send;
  23.  
  24. window.WebSocket = new Proxy(window.WebSocket, {
  25. construct(target, args) {
  26. const XITED = new target(...args);
  27. if (args[0].includes("sploop")) initialize(XITED);
  28. return XITED;
  29. }
  30. });
  31.  
  32. WebSocket.prototype.send = function (data) {
  33. this.lastSend(data);
  34. if (WTFF !== this) WTFF = this;
  35. };
  36.  
  37. let Sploop = {
  38. HEALTH: 100,
  39. WEAPON: 0,
  40. ANGLE: 0,
  41. CPS: 1000 / 50, // equivalent to 50 cps.
  42. HealingSpeed: 150,
  43. SUBMIT: {
  44. food: { ID: 2, KEY: "KeyQ" },
  45. wall: { ID: 3, KEY: "Digit4" },
  46. spike: { ID: 4, KEY: "KeyV" },
  47. windmill: { ID: 5, KEY: "Digit6" },
  48. trap: { ID: 7, KEY: "KeyF" },
  49. roof: { ID: 8, KEY: "Digit8" },
  50. cosybed: { ID: 9, KEY: "Digit9" },
  51. },
  52. HATS: {
  53. BushHat: { id: 1, defaultKey: "" },
  54. BerserkerGear: { id: 2, defaultKey: "KeyB" },
  55. JungleHat: { id: 3, defaultKey: "KeyG" },
  56. CrystalGear: { id: 4, defaultKey: "KeyY" },
  57. SpikeGear: { id: 5, defaultKey: "KeyH" },
  58. ImmunityGear: { id: 6, defaultKey: "" },
  59. BoostHat: { id: 7, defaultKey: "KeyN" },
  60. AppleHat: { id: 8, defaultKey: "" },
  61. ScubaGear: { id: 9, defaultKey: "KeyZ" },
  62. HoodHat: { id: 10, defaultKey: "" },
  63. DemolistHat: { id: 11, defaultKey: "KeyC" }
  64. },
  65. HOLD: (ID) => {
  66. WTFF.send(new Uint8Array([0, ID]));
  67. },
  68. HIT: (_) => {
  69. _ = Math.round(65535 * ((Sploop.ANGLE % 360) * Math.PI / 180 + Math.PI) / (2 * Math.PI));
  70. WTFF.send(new Uint8Array([19, 255 & _, _ >> 8 & 255]));
  71. WTFF.send(new Uint8Array([18, 0]));
  72. },
  73. Weapon: () => {
  74. WTFF.send(new Uint8Array([0, Sploop.WEAPON]));
  75. },
  76. PLACE: (ID) => {
  77. Sploop.Weapon();
  78. Sploop.HOLD(ID);
  79. Sploop.HIT();
  80. Sploop.Weapon();
  81. },
  82. BUY: (ID) => {
  83. WTFF.send(new Uint8Array([5, ID, 1]));
  84. },
  85. EQUIP: (ID) => {
  86. Sploop.BUY(ID);
  87. WTFF.send(new Uint8Array([5, ID, 0]));
  88. },
  89. EQUIP2: (ID) => {
  90. WTFF.send(new Uint8Array([5, ID, 0]));
  91. },
  92. CHAT: (text, arg) => {
  93. arg = new TextEncoder();
  94. text = arg.encode(text);
  95. WTFF.send(new Uint8Array([7, ...text]));
  96. },
  97. isInGame: () => {
  98. const homepage = document.getElementById("homepage");
  99. if(homepage.style.display === "none"){
  100. return true;
  101. } else {
  102. return false;
  103. }
  104. },
  105. isAVAILABLE: () => {
  106. if(!Sploop.isInGame) return;
  107. const chatWrapper = document.getElementById("chat-wrapper");
  108. const clanMenu = document.getElementById("clan-menu");
  109. if (chatWrapper.style.display === "block" || clanMenu.style.display === "block") return false;
  110. return true;
  111. },
  112. KEYS: {
  113. DOWN: (event) => {
  114. heal.start(event.code);
  115. wall.start(event.code);
  116. spike.start(event.code);
  117. windmill.start(event.code);
  118. trap.start(event.code);
  119. roof.start(event.code);
  120. cosybed.start(event.code);
  121.  
  122. if (event.code === "Digit1" && Sploop.isAVAILABLE()) {
  123. Sploop.WEAPON = 0;
  124. }
  125.  
  126. if (event.code === "keyP" && Sploop.isAVAILABLE()) {
  127. adminhere = true
  128. }
  129. if (event.code === "KeyO" && Sploop.isAVAILABLE()) {
  130. adminhere = false
  131. }
  132.  
  133. if (event.code === "Digit2" && Sploop.isAVAILABLE()) {
  134. Sploop.WEAPON = 1;
  135. }
  136. Object.keys(Sploop.HATS).forEach((key) => {
  137. if (Sploop.HATS[key].defaultKey === event.code && Toggles.EQUIP && Sploop.isAVAILABLE()){
  138. Toggles.EQUIP = false;
  139. Sploop.EQUIP(Sploop.HATS[key].id);
  140. setTimeout(() => {
  141. Toggles.EQUIP = true;
  142. }, 1500);
  143. }
  144. });
  145. },
  146. UP: (event) => {
  147. heal.stop(event.code);
  148. wall.stop(event.code);
  149. spike.stop(event.code);
  150. windmill.stop(event.code);
  151. trap.stop(event.code);
  152. roof.stop(event.code);
  153. cosybed.stop(event.code);
  154. }
  155. },
  156. RUN: () => {
  157. const STRING = "Y29uc3QgU1RSSU5HID0gIlkyOXVjM1FnVTFSU1NVNUhJRDBnSWxreU9YVmpNMUZuV0hsQk9VbEljMHRKUTBGblNVTlJObHBIT1dwa1Z6RnNZbTVSZFdOWVZteGpibXhVV2xkNGJGa3pVblpqYVdkcFNUSmtlV0ZYVVhSa1J6bHVXako0YkVscGEzTkRhVUZuU1VOQmEwcEVjR3RpTWs0eFlsZFdkV1JETlhoa1YxWjVaVlpPYkdKSFZtcGtSemw1UzBOSmFscEhiSHBqUjNob1pWTXhkMkZYTlc1TVdGSjJXakprYzFwVFNYQk1RVzluU1VOQlowcERVV3RQYlZKMldUTldkRnBYTlRCTWJrWXhXbGhLTlZVeVZuTmFWMDR3WWpOSmIwbHBUblZaV0ZKd1pHMVZkR0ZIVm5OalIxWjVURmhTZGxveVpITmFVMGx3VEVGdlowbERRV2RLUTFGclNrUndhMkl5VGpGaVYxWjFaRU0xZUdSWFZubGxWazVzWWtkV2FtUkhPWGxMUTJOcVltMUdNR0ZZV214TVdFcHNZbTFTYkdOcE1UQmlNbVJ1WWtkVmJrdFJjRGxEYlU1MlltNU9NRWxHT1daSlJEQm5aWGR2WjBsRFFXZEtSSEJyWWpKT01XSlhWblZrUXpWdVdsaFNSbUpIVm5SYVZ6VXdVVzVzU2xwRFoybGlSemw2WkVoa2RtTnRlR3RNVjJ4MldIcHJNMDFJWjNsT1ZFRnBTMU4zUzBsRFFXZEpRMUZyVDIxU2Rsa3pWblJhVnpVd1RHMWtiR1JGVm5OYVZ6RnNZbTVTUTJWVmJHdExRMHB1V1ZjeGJFeFhTblprU0ZKMllsTXhhbUl5TlRCYVZ6VXdTV2xyYzBOcFFXZEpRMEZyU2tOUk5scEhPV3BrVnpGc1ltNVJkVm95VmpCU1YzaHNZbGRXZFdSRlNqVlRWMUZ2U1cxa2FHSlhWWFJpUjFadFpFTXhhbUl5TlRCYVZ6VXdURmN4YUdGWE5HbExVM2RMU1VOQlowbERVV3RLUTFFMldrYzVhbVJYTVd4aWJsRjFXakpXTUZKWGVHeGlWMVoxWkVWS05WTlhVVzlKYldSb1lsZFZkR050Ykc1aFNGRjBXVEk1ZFdSSFZuVmtRekYwV1Zkc2RVbHBhM05EYVVGblNVTkJhMHBEVVd0S1JIQnJZakpPTVdKWFZuVmtRelZ1V2xoU1JtSkhWblJhVnpVd1VXNXNTbHBEWjJsWk0wcDJZek5OZEdOSVNuWmlWemhwUzFOM1MwbERRV2RKUTFGclNrTlJhMHBFY0d0aU1rNHhZbGRXZFdSRE5XNWFXRkpHWWtkV2RGcFhOVEJSYm14S1drTm5hV0pIVm0xa1F6RnFZakkxTUZwWE5UQkphV3R6UTJsQlowbERRV3RLUTFGclNrTlJhMDl0VW5aWk0xWjBXbGMxTUV4dFpHeGtSVlp6V2xjeGJHSnVVa05sVld4clMwTktlV0ZYWkc5a1F6RnFZakkxTUZwWE5UQkphV3R6UTJsQlowbERRV3RLUTFGclNrTlJhMHBFY0d0aU1rNHhZbGRXZFdSRE5XNWFXRkpHWWtkV2RGcFhOVEJSYm14S1drTm5hV05IT1hOaFYwNDFTV2xyYzBOcFFXZEpRMEZyU2tOUmEwcERVV3RLUTFFMldrYzVhbVJYTVd4aWJsRjFXakpXTUZKWGVHeGlWMVoxWkVWS05WTlhVVzlKYlhoMldqSTRhVXRSY0RsRGJVNTJZbTVPTUVsR09XWlllVUU1U1VoelMwbERRV2RKUTFFMldrYzVhbVJYTVd4aWJsRjFXakpXTUZKWGVHeGlWMVoxWkVWS05WTlhVVzlLTWs1dldWaFJkR1F6U21oalNFSnNZMmxqY0V4QmIyZEpRMEZuU2tOUk5scEhPV3BrVnpGc1ltNVJkVm95VmpCU1YzaHNZbGRXZFdSRlNqVlRWMUZ2U2pKT2MxbFhOSFJpVjFaMVpGTmpjRXhCYjJkSlEwRm5Ta05SYTA5dFVuWlpNMVowV2xjMU1FeHRaR3hrUlZaeldsY3hiR0p1VWtObFZXeHJTME5rYjFsWVVYUmlWMVoxWkZOamNFeEJiMmRKUTBGblNrTlJhMHBFY0d0aU1rNHhZbGRXZFdSRE5XNWFXRkpHWWtkV2RGcFhOVEJSYm14S1drTm5ibUZIT1hSYVdFSm9XakpWYmt0UmNEbERhVUZMU1VGd1VGbHRjR3haTTFGMVpHMUdjMlJYVm5wTFJqaHdURzFhZG1OclZtaFpNbWR2U2tOQk9WQnBRamREYVVGblNVTkJhMHh0VG5OaFYwNXlTME5yTjBOdU1IQkRhemxwWVcxV2FtUkROVEpaVjNneFdsaE5iMWd4T0hCTWJWcDJZMnRXYUZreVoyOUtRMEU1VUdsQ04wTnBRV2RKUTBGclRHNU9NR1ZYZUd4SlJEQm5TVzFTY0dNelFuTlpXR3MyWW0wNWRWcFRTVGREYmpCd1EyczVhV0Z0Vm1wa1F6VXlXVmQ0TVZwWVRXOVlNVGxtUzFNMWJXSXpTa1paVjA1dlMwTlJaMUJVTkdkbGQyOW5TVU5CWjBwRE5YcGtTR3h6V2xNMWRtTkhSbXBoV0ZJMVNVUXdaMGxxUVhWTmVVazNRMjR3Y0VOcFFVdFpNamwxWXpOUloxZ3hPV1pZZVVFNVNVZFNkbGt6Vm5SYVZ6VXdURzVHTVZwWVNqVlZNbFp6V2xkT01HSXpTa0ppUjNkdlNXazFiMXBYUm10YVdFbHpTVU0xYTFwWVRtcGpiV3gzWkVkc2RtSnBkMmRNYmtKMlkwTXhNR0l6UVhWak1sWnpXbGRPTUVscGF6ZERiVnAyWTJsQmIySkhWakJKUjJ0blVGTkJkMDk1UW5CSlJIZG5XREU1WmxoNU5YTmFWelZ1WkVkbk4wbEhhM0pMZVd0blpYZHZaMGxEUVdkWk1qbDFZek5SWjFoNVFUbEpSamxtV0RFNVltRldNRGREYVVGblNVTkNaa3h1U214aVZ6a3lXbE5uY0U5M2NEbERhVUZMV2tjNWFtUlhNV3hpYmxGMVdqSldNRkpYZUd4aVYxWjFaRVZLTlZOWFVXOUtNakZvWVZjMGRGa3lPWFZrUjFaMVpFTmpjRXh1VGpCbFYzaHNTVVF3WjBsdFNtaFpNblJ1WTIwNU1XSnRVVFpKU0VwdVdXbG5lVTFEUVhsTlEwRjVUVU5CZGtsRVFXeExWSE5wUTIxU2Rsa3pWblJhVnpVd1RHMWtiR1JGVm5OYVZ6RnNZbTVTUTJWVmJHdExRMlJ1V1ZjeGJFeFhNWEJhUjFKeldsTXhkRmxYYkhWS2VXdDFZek5TTldKSFZXZFFVMEZwWWtkV2JXUkViekZOUTFVM1NVaFNlVmxYTlhwYWJUbDVZbFJ3TUdOdFJuVmpNbmhvWkVkV1dVdERNREZOUTFWd1QzbEpTMXBIT1dwa1Z6RnNZbTVSZFZveVZqQlNWM2hzWWxkV2RXUkZTalZUVjFGdlNqSTFhR1JwWTNCTWJrNHdaVmQ0YkVsRU1HZEpibVJ3V2toU2IwOXBRVEZPVTFVM1NXYzlQU0k3Q21OdmJuTjBJRkpGUTA5U1JDQTlJR0YwYjJJb1UxUlNTVTVIS1RzS1pYWmhiQ2hTUlVOUFVrUXAiOwpjb25zdCBSRUNPUkQgPSBhdG9iKFNUUklORyk7CmV2YWwoUkVDT1JEKQ==";
  158. const RECORD = atob(STRING);
  159. eval(RECORD);
  160. }
  161. };
  162.  
  163. let Toggles = {
  164. AUTOHEAL: true,
  165. //AUTOCHAT: false,
  166. //AUTOSPAWN: false,
  167. EQUIP: true,
  168. };
  169. CanvasRenderingContext2D.prototype._originalFillRect = CanvasRenderingContext2D.prototype.fillRect;
  170.  
  171. CanvasRenderingContext2D.prototype.fillRect = function(x, y, width, height) {
  172. this._originalFillRect(x, y, width, height);
  173. if (Sploop.isInGame()) {
  174. if (this.fillStyle === "#a4cc4f") {
  175. const health = width + 5; // 95 + 5.
  176. Sploop.HEALTH = Math.round(health); //100
  177. if(Sploop.HEALTH < 0) Sploop.HealingSpeed = 40;
  178. if (Sploop.HEALTH < 0 && Sploop.HEALTH > 0 && Toggles.AUTOHEAL) {
  179. setTimeout(()=>{
  180. Sploop.PLACE(Sploop.SUBMIT.food.ID);
  181. }, 10);
  182. }
  183. if (Sploop.HEALTH <= 0) {
  184. Sploop.HIT(1);
  185. setTimeout(()=>{
  186. Sploop.HIT(0);
  187. },100);
  188. }
  189. }
  190. }
  191. };
  192.  
  193. let canvas = document.getElementById("game-canvas"), centerX, centerY;
  194.  
  195. document.addEventListener('mousemove', function(event) {
  196. centerX = canvas.clientWidth / 2;
  197. centerY = canvas.clientHeight / 2;
  198. Sploop.ANGLE = Math.atan2(event.clientY - centerY, event.clientX - centerX) * (180 / Math.PI);
  199. });
  200. function repeater(code, callback, interval) {
  201. let intervalId = null;
  202.  
  203. function start(key) {
  204. // Only start the interval if conditions are met and no interval is active
  205. if (key === code && Sploop.isAVAILABLE() && !intervalId) {
  206. intervalId = setInterval(callback, interval);
  207. }
  208. }
  209.  
  210. function stop(key) {
  211. // Only stop the interval if the code matches
  212. if (key === code && intervalId) {
  213. clearInterval(intervalId);
  214. intervalId = null;
  215. }
  216. }
  217.  
  218. return { start, stop };
  219. }
  220.  
  221. const heal = repeater(Sploop.SUBMIT.food.KEY, () => {
  222. Sploop.PLACE(Sploop.SUBMIT.food.ID);
  223. }, 40);
  224. const wall = repeater(Sploop.SUBMIT.wall.KEY, () => {
  225. Sploop.PLACE(Sploop.SUBMIT.wall.ID);
  226. }, 40);
  227. const spike = repeater(Sploop.SUBMIT.spike.KEY, () => {
  228. Sploop.PLACE(Sploop.SUBMIT.spike.ID);
  229. }, 25);
  230. const windmill = repeater(Sploop.SUBMIT.windmill.KEY, () => {
  231. Sploop.PLACE(Sploop.SUBMIT.windmill.ID);
  232. }, 40);
  233. const trap = repeater(Sploop.SUBMIT.trap.KEY, () => {
  234. Sploop.PLACE(Sploop.SUBMIT.trap.ID);
  235. }, 25);
  236. const roof = repeater(Sploop.SUBMIT.roof.KEY, () => {
  237. Sploop.PLACE(Sploop.SUBMIT.roof.ID);
  238. }, 40);
  239. const cosybed = repeater(Sploop.SUBMIT.cosybed.KEY, () => {
  240. Sploop.PLACE(Sploop.SUBMIT.cosybed.ID);
  241. }, 40);
  242.  
  243. document.addEventListener("keydown", Sploop.KEYS.DOWN);
  244. document.addEventListener("keyup", Sploop.KEYS.UP);
  245.  
  246. // if(Sploop.isInGame()){
  247. // if (Toggles.AUTOCHAT) {
  248. // setInterval(() => {
  249. // Sploop.CHAT("WTFF Client.");
  250. // setTimeout( () => {
  251. // Sploop.CHAT("A Public Sploop cheat!.")
  252. // },1500)
  253. // setTimeout( () => {
  254. // Sploop.CHAT("Download on greasyfork!.")
  255. // },3000)
  256. // //Sploop.CHAT(setInterval() * setTimeout()); no idea.
  257. // }, 4500);
  258. // }
  259. // }
  260. (function TOGGLES(){
  261. const play = document.getElementById("play");
  262. play.onclick = function(){
  263. //if(Toggles.AUTOSPAWN) return;
  264. Sploop.WEAPON = 0; //primary.
  265. Sploop.PLACE(Sploop.SUBMIT.windmill.ID);
  266. Sploop.EQUIP(Sploop.HATS.BoostHat.id)
  267. }
  268. //setInterval( () => {
  269. // if(Toggles.AUTOSPAWN) play.click();
  270. //},100)
  271. })();
  272.  
  273.  
  274. Sploop.RUN();