Zombs.io Bad Hack

The best public script for zombs.io

Szkript telepítése?
A szerző által javasolt szkript

Ez is érdekelhet: Base Record & Rebuild

Szkript telepítése
// ==UserScript==
// @name         Zombs.io Bad Hack
// @namespace    https://tampermonkey.net/
// @version      4.5.0
// @description  The best public script for zombs.io
// @author       vn︵ℌαʋү༉
// @match        http://zombs.io/*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
// ==/UserScript==


function Bad() {
   if (location.hash.split('/')[4] == 'noscript') { return }
   let cssMain = `
      .bad-btn{
         border: none;
         color: white;
         padding: 10px 20px;
         text-align: center;
         font-size: 14px;
         margin: 2px 0px;
         opacity: 0.9;
         transition: 0.2s;
         display: inline-block;
         border-radius: 15px;
         cursor: pointer;
         text-shadow: -1px 1px 1.5px #242526;
      }
         .bad-btn:hover{
            opacity: 1
         }
         .bad-blue{
            background-color: #5463FF
         }
         .bad-magenta{
            background-color: #E900FF
         }
         .bad-gray{
            background-color: #606060
         }
         .bad-yellow{
            background-color: #FFC600
         }
         .bad-red{
            background-color: #FF1818
         }
         .bad-green{
            background-color: #06FF00
         }
         .bad-pink{
            background-color: #FF6B6B
         }
         .bad-cyan{
            background-color: #39AEA9
         }
         .bad-orange{
            background-color: #FF5F00
         }
         .bad-textbox{
            border: none;
            color: white;
            padding: 10px 10px;
            text-align: center;
            font-size: 14px;
            margin: 2px 0px;
            opacity: 0.9;
            transition: 0.2s;
            display: inline-block;
            border-radius: 15px;
            background-color: #606060;
            text-shadow: -1px 1px 1.5px #242526;
         }

         .hud-toolbar .hud-toolbar-inventory .hud-toolbar-item.is-empty {
            pointer-events: auto;
         }

         #hud-menu-shop {
            top: 45%;
            left: 50%;
            width: 690px;
            height: 450px;
            margin: 0;
            transform: translate(-50%, -50%);
            padding: 20px 20px 20px 20px;
         }
         .hud-menu-shop .hud-shop-grid {
            height: 330px;
         }
         #hud-menu-settings {
            top: 45%;
            left: 50%;
            width: 780px;
            height: 500px;
            margin: 0;
            transform: translate(-50%, -50%);
            padding: 20px 20px 20px 20px;
         }
         .hud-menu-settings .hud-settings-grid {
            width: 750px;
            height: 420px;
         }

         .hud-menu-shop .hud-shop-tabs a[data-type=Pet]::after {
            content: none
         }

         .hud-menu-iframe h3 {
            display: block;
            margin: 0;
            line-height: 20px;
         }

         .hud-menu-iframe{
            display: none;
            position: fixed;
            border-radius: 4px;
            top: 45%;
            left: 50%;
            padding: 20px;
            width: 780px;
            height: 500px;
            transform: translate(-50%, -50%);
            background: rgba(0, 0, 0, 0.6);
            color: #eee;
            z-index: 20;
         }

         .hud-menu-iframe .hud-iframe-grid {
            text-align: center;
            display: block;
            position: relative;
            height: 420px;
            margin: 20px 0 0;
            padding: 10px;
            background: rgba(0, 0, 0, 0.2);
            overflow-y: auto;
            border-radius: 3px;
         }

         .hud-menu-icons .hud-menu-icon[data-type=Iframe]::before {
            background-image: url("https://media.discordapp.net/attachments/870020008128958525/876133010360107048/unknown.png");
            background-size: 30px;
         }
         [data-item=PetGhost][data-tier='1']::after {
            background-image: url('/asset/image/ui/inventory/inventory-pet-ghost-t1.svg');
      `;
   let stylesMain = document.createElement("style");
   stylesMain.appendChild(document.createTextNode(cssMain));
   document.head.appendChild(stylesMain);
   stylesMain.type = "text/css";

   document.querySelectorAll('.ad-unit, .ad-unit-medrec, .hud-intro-guide-hints, .hud-intro-left, .hud-intro-youtuber, .hud-intro-footer, .hud-intro-stone, .hud-intro-tree, .hud-intro-social, .hud-intro-more-games, .hud-intro-guide, .hud-day-night-overlay, .hud-respawn-share, .hud-party-joining, .hud-respawn-corner-bottom-left, #hud-menu-shop > div.hud-shop-grid > a:nth-child(10)').forEach(el => el.remove());
   document.getElementsByClassName('hud-intro-name')[0].setAttribute('maxlength', 29);
   document.getElementsByClassName('hud-party-tag')[0].setAttribute('maxlength', 49);
   document.querySelector(".hud-chat-messages").style.width = "1800px";

   let addZombieShield = document.createElement("a");
   addZombieShield.classList.add("hud-toolbar-item");
   addZombieShield.setAttribute("data-item", "ZombieShield");
   addZombieShield.setAttribute("data-tier", "1");
   document.getElementsByClassName("hud-toolbar-inventory")[0].appendChild(addZombieShield);

   let addWoody = document.createElement("a");
   addWoody.classList.add("hud-toolbar-item");
   addWoody.setAttribute("data-item", "PetMiner");
   addWoody.setAttribute("data-tier", "1");
   document.getElementsByClassName("hud-toolbar-inventory")[0].appendChild(addWoody);

   let addCARL = document.createElement("a");
   addCARL.classList.add("hud-toolbar-item");
   addCARL.setAttribute("data-item", "PetCARL");
   addCARL.setAttribute("data-tier", "1");
   document.getElementsByClassName("hud-toolbar-inventory")[0].appendChild(addCARL);

   let addSellPet = document.createElement("a");
   addSellPet.classList.add("hud-toolbar-item");
   addSellPet.setAttribute("data-item", "PetGhost");
   addSellPet.setAttribute("data-tier", "1");
   document.getElementsByClassName("hud-toolbar-inventory")[0].appendChild(addSellPet);

   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(1)").addEventListener('contextmenu', buyPickaxe);
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(2)").addEventListener('contextmenu', buySpear);
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(3)").addEventListener('contextmenu', buyBow);
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(4)").addEventListener('contextmenu', buyBomb);
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(5)").addEventListener('contextmenu', () => { shopShortcut("HealthPotion", 1) });
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(6)").addEventListener('contextmenu', () => { shopShortcut("PetHealthPotion", 1) });
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(8)").addEventListener('contextmenu', buyZombieShield);
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(9)").addEventListener('contextmenu', () => { buyPet("PetMiner", getPetTier(6)) });
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(10)").addEventListener('contextmenu', () => { buyPet("PetCARL", getPetTier(5)) });
   document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(11)").addEventListener('contextmenu', () => { Game.currentGame.network.sendRpc({ name: "DeleteBuilding", uid: game.ui.getPlayerPetUid() }) });

   function buyPet(item, tier) {
      if (game.ui.getPlayerPetName() == item) {
         shopShortcut("PetRevive", 1)
      } else {
         let i = 0
         let j = setInterval(() => {
            shopShortcut(item, tier)
            i++
            if (i >= 25 || game.ui.getPlayerPetName() == item) {
               i = 0
               clearInterval(j)
            }
         }, 250);
      }
   }

   function getPetTier(num) {
      if (document.querySelectorAll(".hud-shop-item-tier")[5].childNodes[0].textContent.match(/\d+/) != null) {
         let petLevel = document.querySelectorAll(".hud-shop-item-tier")[num].childNodes[0].textContent.match(/\d+/)[0]
         if (petLevel <= 8) return 1
         if (petLevel <= 16) return 2
         if (petLevel <= 24) return 3
         if (petLevel <= 32) return 4
         if (petLevel <= 48) return 5
         if (petLevel <= 64) return 6
         if (petLevel <= 96) return 7
         if (petLevel > 96) return 8
      } else return 8
   }

   function equipItem(item, tier) {
      game.network.sendRpc({
         name: "EquipItem",
         itemName: item,
         tier: tier
      })
   };

   function buyItem(item, tier) {
      game.network.sendRpc({
         name: "BuyItem",
         itemName: item,
         tier: tier
      })
   }

   function shopShortcut(item, tier) {
      buyItem(item, tier)
      if (game.ui.playerWeaponName !== item) {
         equipItem(item, tier)
      }
   }

   function buyPickaxe() {
      let cost = [0, 1000, 3000, 6000, 8000, 24000, 80000];
      if (game.ui.playerTick.gold >= cost[game.ui.inventory.Pickaxe.tier]) {
         shopShortcut("Pickaxe", game.ui.inventory.Pickaxe.tier + 1)
      }
   }

   function buySpear() {
      let tier = game.ui.inventory.Spear ? game.ui.inventory.Spear.tier : 0;
      let cost = [1400, 2800, 5600, 11200, 22500, 45000, 90000];
      if (game.ui.playerTick.gold >= cost[tier]) {
         shopShortcut("Spear", tier + 1)
      }
   }

   function buyBow() {
      let tier = game.ui.inventory.Bow ? game.ui.inventory.Bow.tier : 0;
      let cost = [100, 400, 2000, 7000, 24000, 30000, 90000];
      if (game.ui.playerTick.gold >= cost[tier]) {
         shopShortcut("Bow", tier + 1)
      }
   }

   function buyBomb() {
      let tier = game.ui.inventory.Bomb ? game.ui.inventory.Bomb.tier : 0;
      let cost = [100, 400, 3000, 5000, 24000, 50000, 90000];
      if (game.ui.playerTick.gold >= cost[tier]) {
         shopShortcut("Bomb", tier + 1)
      }
   }

   function buyZombieShield() {
      let tier = game.ui.inventory.ZombieShield ? game.ui.inventory.ZombieShield.tier : 0;
      let cost = [1000, 3000, 7000, 14000, 18000, 22000, 24000, 30000, 45000, 70000];
      if (game.ui.playerTick.gold >= cost[tier]) {
         shopShortcut("ZombieShield", tier + 1)
         document.querySelector("#hud-toolbar > div.hud-toolbar-inventory > a:nth-child(8)").setAttribute("data-tier", tier + 1);
      }
   }

   //Iframe start
   // menu stuff start
   document.querySelector('#hud').insertAdjacentHTML('beforeend', `
      <div id="hud-menu-iframes" ; class="hud-menu-iframe hud-menu">
         <a class="hud-menu-close"></a>
         <h3>Iframe Multibox</h3>
         <div class="hud-iframe-grid">
            <button class="bad-btn bad-cyan" id="newalt">New Alt</button>
            <button class="bad-btn bad-red" id="delalt">Delete Alt</button>
            <input class="bad-textbox" id="delid" style="width: 10%" placeholder="Alt's Id">
            <button class="bad-btn bad-red" id="delallalt">Delete All Alt</button>
            <button class="bad-btn bad-cyan" id="altmove">Stay</button>
         </div>
      </div>
   `)
   document.querySelector("#hud-menu-iframes > a").addEventListener('click', () => document.getElementById('hud-menu-iframes').style.display = 'none')
   let mm = document.getElementsByClassName("hud-menu-iframe")[0];

   function iframeMenu() {
      if (["none", ""].includes(mm.style.display)) {
         mm.style.display = "block";
         for (let i of Array.from(document.getElementsByClassName("hud-menu"))) {
            if (i.classList.contains('hud-menu-iframe')) { return; };
            i.style.display = "none";
         };
      } else {
         mm.style.display = "none";
      };
   };

   document.getElementsByClassName("hud-menu-icons")[0].insertAdjacentHTML("beforeend", `<div class="hud-menu-icon" data-type="Iframe"></div>`);
   document.querySelectorAll(".hud-menu-icon")[3].addEventListener("click", iframeMenu)
   document.getElementsByClassName("hud-menu-iframe")[0].style.overflow = "auto";

   for (let i of Array.from(document.getElementsByClassName("hud-menu-icon"))) {
      if (i.dataset.type !== "Iframe") {
         i.addEventListener('click', function () {
            if (document.getElementsByClassName("hud-menu-iframe")[0].style.display == "block") {
               document.getElementsByClassName("hud-menu-iframe")[0].style.display = "none";
            };
         });
      };
   };

   for (let i of Array.from(document.getElementsByClassName("hud-spell-icon"))) {
      if (i.dataset.type !== "HealTowersSpell" && i.dataset.type !== "TimeoutItem") {
         i.addEventListener('click', function () {
            if (document.getElementsByClassName("hud-menu-iframe")[0].style.display == "block") {
               document.getElementsByClassName("hud-menu-iframe")[0].style.display = "none";
            };
         });
      };
   };

   document.addEventListener("keyup", e => {
      if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
         if (e.key === "o" || e.key === "p" || e.key === "b" || e.key === "/" || e.keyCode == 27) {
            if (mm.style.display == "block") {
               mm.style.display = "none";
            }
         }
      }
   })

   var IframesCount = 0;
   document.getElementById('newalt').addEventListener('click', function () {
      let iframe = document.createElement('iframe');
      IframesCount++;
      iframe.id = "iframeId" + IframesCount;
      iframe.className = "iframeAlts";
      iframe.src = `http://zombs.io/#/${game.options.serverId}/${game.ui.playerPartyShareKey}/${iframe.id}/noscript`;
      iframe.style.display = 'none';
      iframe.addEventListener('load', function (e) {
         iframe.contentWindow.eval(`
         
         !window.Log && (Log = eval);
         eval = (e) => {
            if (e.includes('typeof window')) return 'object';
            if (e.includes('typeof process')) return undefined;
            if (e.includes('Game.currentGame.network.connected')) return true;
            if (e.includes('Game.currentGame.world.myUid')) return 0;
            if (e.includes('document.getElementById("hud").children.length')) return 25;

            let log = Log(e);
            return log;
         }
         document.body.innerHTML = "<script src='/asset/sentry.js'></script><script src='/asset/app.js?1646574495'></script>";
         
         window.SendWs = () => {
            game.network.connectionOptions = parent.game.options.servers[parent.game.options.serverId];
            game.network.connected = true;

            let ws = new WebSocket(parent.game.network.socket.url + game.network.connectionOptions.port);
            ws.binaryType = 'arraybuffer';

            ws.onopen = (data) => {
               ws.network = new game.networkType();

               ws.network.sendPacket = (_event, _data) => {
                  ws.send(ws.network.codec.encode(_event, _data));
               }

               ws.onmessage = msg => {
                  let data = ws.network.codec.decode(msg.data);
                  console.log(data)
                  
                  switch (data.opcode) {
                     case 0:
                        if (data.entities[ws.uid].position) ws.entity = data.entities[ws.uid];
                        if (!ws.entity) return;
                        ws.moveToward = (position) => {
                           let x = Math.round(position.x);
                           let y = Math.round(position.y);

                           let myX = Math.round(ws.entity.position.x);
                           let myY = Math.round(ws.entity.position.y);

                           let offset = 100;

                           if (-myX + x > offset) ws.network.sendInput({ left: 0 }); else ws.network.sendInput({ left: 1 });
                           if (myX - x > offset) ws.network.sendInput({ right: 0 }); else ws.network.sendInput({ right: 1 });

                           if (-myY + y > offset) ws.network.sendInput({ up: 0 }); else ws.network.sendInput({ up: 1 });
                           if (myY - y > offset) ws.network.sendInput({ down: 0 }); else ws.network.sendInput({ down: 1 });
                        }

                        switch (parent.document.getElementById('altmove').innerText) {
                           case "Follow Player":
                              ws.moveToward(parent.game.ui.playerTick.position);
                              break;
                           case "Follow Cursor":
                              ws.moveToward(parent.game.renderer.screenToWorld(parent.game.ui.mousePosition.x, parent.game.ui.mousePosition.y));
                              break;
                           case "Stay":
                              ws.network.sendInput({ left: 0, right: 0, up: 0, down: 0 });
                              break;
                           case "Move Exactly":
                              if (parent.document.getElementById('hud-chat').className.includes('is-focus') || parent.document.getElementById('hud-menu-settings').style.display == 'block') break;
                              if (parent.game.inputManager.keysDown[87]) { ws.network.sendInput({ up: 1, down: 0 }) } else { ws.network.sendInput({ up: 0 }) }; // w
                              if (parent.game.inputManager.keysDown[65]) { ws.network.sendInput({ left: 1, right: 0 }) } else { ws.network.sendInput({ left: 0 }) }; // a
                              if (parent.game.inputManager.keysDown[83]) { ws.network.sendInput({ down: 1, up: 0 }) } else { ws.network.sendInput({ down: 0 }) }; // s
                              if (parent.game.inputManager.keysDown[68]) { ws.network.sendInput({ right: 1, left: 0 }) } else { ws.network.sendInput({ right: 0 }) }; // d
                              break;
                        }

                        let worldMousePos = parent.game.renderer.screenToWorld(parent.game.ui.mousePosition.x, parent.game.ui.mousePosition.y);
                        ws.network.sendInput({ mouseMoved: game.inputPacketCreator.screenToYaw((-ws.entity.position.x + worldMousePos.x) * 100, (-ws.entity.position.y + worldMousePos.y) * 100) });

                        if (parent.game.inputManager.mouseDown) {
                           ws.network.sendInput({ mouseDown: 0 });
                           ws.network.sendInput({mouseMovedWhileDown: game.inputPacketCreator.screenToYaw((-ws.entity.position.x + worldMousePos.x)*100, (-ws.entity.position.y + worldMousePos.y)*100)});
                        } else {
                           ws.network.sendInput({ mouseUp: 0 })
                           ws.network.sendInput({ mouseMoved: game.inputPacketCreator.screenToYaw((-ws.entity.position.x + worldMousePos.x) * 100, (-ws.entity.position.y + worldMousePos.y) * 100) });
                        }
                        break;
                     case 4:
                        ws.send(game.network.codec.encode(6, {}));
                        ws.network.sendRpc({ name: 'JoinPartyByShareKey', partyShareKey: parent.game.ui.playerPartyShareKey });
                        ws.uid = data.uid;
                        break;
                     case 5:
                        ws.network.sendPacket(4, { displayName: 'KINGGG_BOBBBB', extra: data.extra });
                        break;
                     case 9:
                        switch (data.name) {
                           case 'Dead':
                              ws.network.sendPacket(3, { respawn: 1 })
                              break;
                           case 'SetPartyList':
                              break;
                           case 'Leaderboard':
                              //ws.send(new Uint8Array([9,6,0,0,0,126,8,0,0,108,27,0,0,146,23,0,0,82,23,0,0,8,91,11,0,8,91,11,0,0,0,0,0,32,78,0,0,76,79,0,0,172,38,0,0,120,155,0,0,166,39,0,0,140,35,0,0,36,44,0,0,213,37,0,0,100,0,0,0,120,55,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,6,0,0]));
                              ws.send(new Uint8Array([9,6,0,0,0,100,0,0,0,184,11,0,0,196,9,0,0,8,7,0,0,160,134,1,0,0,0,0,0,160,134,1,0,32,78,0,0,64,13,3,0,32,191,2,0,64,66,15,0,160,134,1,0,160,134,1,0,160,134,1,0,160,134,1,0,0,0,0,0,108,51,1,0,0,0,0,0,0,0,0,0,0,0,0,0,120,105,0,0,144,1,0,0,64,66,15,0,100,25,0,0]))
                              break;
                        }
                        break;
                  }
               }
               ws.onclose = () => {
                  console.log('Ws closed.');
                  parent.document.getElementById(location.hash.split('/')[3]).remove()
               }
            }
         }
         window.SendWs();
         `)
      })
      document.body.append(iframe);
   })

   let AltMoveClicks = 0;
   var AltMoveStyle = "Stay";
   document.getElementById('altmove').addEventListener('click', function () {
      let moveOrder = ["Stay", "Follow Cursor", "Follow Player", "Move Exactly"];
      AltMoveClicks++;
      AltMoveStyle = moveOrder[AltMoveClicks % 4]
      document.getElementById('altmove').innerText = AltMoveStyle;
   })

   document.getElementById('delallalt').addEventListener('click', function () {
      if (document.getElementsByClassName('iframeAlts').length > 0) {
         for (let iframe of document.getElementsByClassName('iframeAlts')) {
            iframe.remove();
         }
      }
   })
   /*
//menu stuff end
let numOfAlts = 0
let aitoid = 0
let shouldAITO = false
 
game.network.addRpcHandler("DayCycle", () => {
if (shouldAITO) {
   aitoid += 1
   console.log("aito" + aitoid)
   let NewAITO = document.createElement('Iframe');
   NewAITO.id = "aito" + aitoid;
   NewAITO.src = `http://zombs.io/#/${game.options.serverId}/badhack`;
         NewAITO.addEventListener('load', function () {
            NewAITO.contentWindow.eval(`
       document.getElementsByClassName("hud-intro-play")[0].click()
       game.network.addEntityUpdateHandler(() => {
           if (game.world.inWorld && game.network.connected) {
               if (game.ui.getPlayerPartyShareKey() == window.parent.game.ui.getPlayerPartyShareKey() && game.ui.playerTick.gold >= 10000) {
                    console.log("buy timeout")
                    game.network.sendRpc({
                        name: "BuyItem",
                        itemName: "Pause",
                        tier: 1
                    });
                    setTimeout(() => {
                        window.parent.document.getElementById("aito" + aitoid).remove()
                    }, 250)
                } else if (game.ui.getPlayerPartyShareKey() != window.parent.game.ui.getPlayerPartyShareKey()){
                    console.log("join party")
                    game.network.sendRpc({
                        name: "JoinPartyByShareKey",
                        partyShareKey: window.parent.game.ui.getPlayerPartyShareKey()
                    });
                }
            }
       })
   `)
         })
         NewAITO.style.display = "none"
         document.body.append(NewAITO)
      }
})

   document.getElementById("aitobtn").addEventListener("click", function () {
      if (!shouldAITO) {
         shouldAITO = true
         document.getElementById("aitobtn").innerHTML = "AITO On"
      } else {
         shouldAITO = false
         document.getElementById("aitobtn").innerHTML = "AITO Off"
      }

   });
   document.getElementById("newalt").addEventListener("click", function () {
      numOfAlts++;
      let newDiv = document.createElement('div');
      newDiv.className = "frameholder";
      newDiv.id = "frame" + numOfAlts;
      let newIframe = document.createElement('iFrame');
      newIframe.className = "frames";
      newIframe.src = `http://zombs.io/#/${game.options.serverId}/${game.ui.playerPartyShareKey}`;

      document.getElementsByClassName("hud-menu-more")[0].insertBefore(newDiv, null);
      newDiv.appendChild(newIframe);
   });

   document.getElementById("delallalt").addEventListener("click", function F_deleteAllAlt() {
      for (let i = 1; i <= numOfAlts; i++) {
         document.getElementById("frame" + i).remove();
      }
      numOfAlts = 0;
   });

   document.getElementById("delalt").addEventListener("click", function F_deleteAlt() {
      let deletealtnum = parseInt(document.getElementById('delid').value);
      document.getElementById("frame" + deletealtnum).remove();
      for (let i = 1; i <= (numOfAlts - deletealtnum); i++) {
         document.getElementById("frame" + (deletealtnum + i)).id = "frame" + (deletealtnum + i - 1);
      }
      numOfAlts--;
   });


//Iframe end
*/

   function createCoordinates() {
      let x = document.createElement('div')
      x.style = 'position: relative; margin: 0;';
      x.innerHTML = `<h3 id="coords"; style="margin: 0;"></h3>`
      x.style.textAlign = "left"
      document.querySelector("#hud > div.hud-bottom-left").append(x)
   }
   let hasBeenInWorld = false;

   game.network.addEnterWorldHandler(() => {
      if (!hasBeenInWorld) {
         hasBeenInWorld = true
         setInterval(() => {
            document.querySelector("#coords")
               .innerText = `X: ${game.ui.playerTick?.position?.x}\n Y: ${game.ui.playerTick?.position?.y}`
         }, 16)
         createCoordinates()
      }
      game.ui.components.MenuShop.onTwitterFollow();
      game.ui.components.MenuShop.onTwitterShare();
      game.ui.components.MenuShop.onFacebookLike();
      game.ui.components.MenuShop.onFacebookShare();
      game.ui.components.MenuShop.onYouTubeSubscribe();
   })

   var isSpamming = 0;

   function pauseChatSpam(e) {
      if (!isSpamming) {
         window.spammer = setInterval(() => {
            game.network.sendRpc({
               name: "SendChatMessage",
               channel: "Local",
               message: e
            })
         }, 100)
      } else if (isSpamming) {
         clearInterval(window.spammer)
      }
      isSpamming = !isSpamming
   }

   game.network.addRpcHandler('ReceiveChatMessage', function (e) {
      if (e.uid == game.ui.playerTick.uid) {
         if (e.message == "!boss") {
            setTimeout(() => {
               game.network.sendRpc({
                  name: "SendChatMessage",
                  message: "9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97, 105, 121",
                  channel: "Local"
               });
            }, 1050);
         };
         if (e.message == "!marker") {
            var map = document.getElementById("hud-map");
            map.insertAdjacentHTML("beforeend", `<div style="color: red; display: block; left: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.left)}%; top: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.top)}%; position: absolute;" class='hud-map-player'></div>`)
            game.ui.getComponent('PopupOverlay').showHint(`Added Marker`, 1500);
         };
      };
   });

   function checkStatus(party) {
      if (party.isOpen == 1) {
         return '<a style = "color: #00e700;opacity: 0.9;">[Open]<a/>';
      } else if (!party.isOpen == 1) {
         return '<a style = "color:red;opacity: 0.9;">[Private]<a/>';
      }
   };
   let partyCheck = (all_parties) => {
      document.getElementsByClassName('hud-party-grid')[0].innerHTML = '';

      for (let i in all_parties) {
         let parties = all_parties[i];
         let tab = document.createElement('div');
         tab.classList.add('hud-party-link');
         tab.classList.add('custom-party');
         tab.id = parties.partyId;
         tab.isPublic = parties.isOpen;
         tab.name = parties.partyName;
         tab.members = parties.memberCount;
         tab.innerHTML = `
                  <strong>${parties.partyName} ${checkStatus(parties)}<strong/>
                  <small>id: ${parties.partyId}</small> <span>${parties.memberCount}/4<span/>
              `;

         if (parties.memberCount == 4) {
            tab.classList.add('is-disabled');
         } else {
            tab.style.display = 'block';
         }
         setTimeout(() => {
            if (parties.partyId == game.ui.playerPartyId) tab.classList.add('is-active');
         }, 1000);

         if (parties.isOpen !== 1) tab.classList.add('is-disabled');

         tab.addEventListener('click', function () {
            if (tab.isPublic == 1 && tab.members < 4) {
               game.network.sendRpc({
                  name: 'JoinParty',
                  partyId: Math.floor(tab.id)
               });
            } else if (!tab.isPublic == 1) {
               game.ui.getComponent('PopupOverlay').showHint("You can't request private parties!", 800);
            }
         });
         document.getElementsByClassName('hud-party-grid')[0].appendChild(tab);
      };
   };

   game.network.addRpcHandler("SetPartyList", (e) => { partyCheck(e) });

   let settingsHTML = `
      <div style="text-align: center">
         <button class="bad-btn bad-magenta" id="lagspam-btn">Lag Spam Off</button>
         <button class="bad-btn bad-magenta" id="togglespmch">Chat Spam Off</button>
         <input type="text" id="spamchat" placeholder="Message" class="bad-textbox" style="width: 40%">
         <hr>
         <button id="sellall" class="bad-btn bad-red">Sell All</button>
         <button id="sellwall" class="bad-btn bad-red">Wall</button>
         <button id="selldoor" class="bad-btn bad-red">Door</button>
         <button id="selltrap" class="bad-btn bad-red">Slow Trap</button>
         <button id="sellharvester" class="bad-btn bad-red">Harvester</button>
         <br>
         <button id="sellarrow" class="bad-btn bad-red">Arrow</button>
         <button id="sellcannon" class="bad-btn bad-red">Cannon</button>
         <button id="sellmelee" class="bad-btn bad-red">Melee</button>
         <button id="sellbomb" class="bad-btn bad-red">Bomb</button>
         <button id="sellmagic" class="bad-btn bad-red">Mage</button>
         <button id="sellminer" class="bad-btn bad-red">Gold Miner</button>
         <hr>
         <button class="bad-btn bad-yellow" id="menu-leaveparty-btn" onclick ='Game.currentGame.network.sendRpc({name: "LeaveParty"})'>Leave Party</button>
         <button class="bad-btn bad-yellow" id="menu-jpbsk-btn" onclick='Game.currentGame.network.sendRpc({name:"JoinPartyByShareKey", partyShareKey: document.querySelector("#menu-jpbsk-input").value})'>Join Party</button>
         <input type="text" class="bad-textbox" id="menu-jpbsk-input" style="width: 40%" placeholder="Share Key">
         <button class="bad-btn bad-yellow" id="autoaccept-btn">Accepter Off</button>
         <br>
         <button class="bad-btn bad-yellow" id="spamallparty-btn">Spam All Party Off</button>
         <button class="bad-btn bad-yellow" id="spampartybyid-btn">Spam Party By ID Off</button>
         <input type="text" class="bad-textbox" id="party-id-input" style="width: 20%" placeholder="Party ID">
         <button class="bad-btn bad-yellow" id="newtab">New Party Tab</button>
         <hr>
         <button id="healplayer" class="bad-btn bad-green">Heal PLayer On</button>
         <input type="text" class="bad-textbox" value="20" id="healplayerinput" style="width: 8%">
         <button id="healpet" class="bad-btn bad-green">Heal Pet On</button>
         <input type="text" class="bad-textbox" value="30" id="healpetinput" style="width: 8%">
         <button id="revivepet" class="bad-btn bad-green">Revive On</button>
         <button id="evolvepet" class="bad-btn bad-green">Evolve On</button>
         <hr>
         <button class="bad-btn bad-blue" id="clearchat-btn">Clear Chat Off</button>
         <button class="bad-btn bad-blue" id="autoupgradeall-btn">Upgrade Off</button>
         <button class="bad-btn bad-blue" id="togglespinner">Spinner Off</button>
         <button class="bad-btn bad-blue" id="toggleaim">Aim Off</button>
         <select id="aimOptions" class="bad-textbox">
            <option value="pl" selected>Players</option>
            <option value="zo">Zombies</option>
         </select>
         <br>
         <button class="bad-btn bad-blue" id="toggleahrc">AHRC Off</button>
         <button class="bad-btn bad-blue" id="toggleresp">Respawn Off</button>
         <button class="bad-btn bad-blue" id="togglebot">Bot Off</button>
         <button class="bad-btn bad-blue" id="toggleswing">Swing Off</button>
         <button class="bad-btn bad-blue" id="togglerb">Rebuild Off</button>
         <hr>
         <button id="hidechat" class="bad-btn bad-pink">Hide Chat</button>
         <button id="hidepop" class="bad-btn bad-pink">Hide Popup</button>
         <button id="hideldb" class="bad-btn bad-pink">Hide Leaderboard</button>
         <button id="hidemap" class="bad-btn bad-pink">Hide Map</button>
         <button id="hidepip" class="bad-btn bad-pink">Hide PIP</button>
         <hr>
         <button id="hideground" class="bad-btn bad-cyan">Hide Ground</button>
         <button id="hidenpcs" class="bad-btn bad-cyan">Hide NPCs</button>
         <button id="hideenv" class="bad-btn bad-cyan">Hide Env</button>
         <button id="hideproj" class="bad-btn bad-cyan">Hide Proj</button>
         <button id="hideall" class="bad-btn bad-cyan">Hide All</button>
         <button id="freezegame" class="bad-btn bad-cyan">Stop Game</button>
         <hr>
         <button class="bad-btn bad-gray" onclick="Game.currentGame.network.disconnect()">Disconnect</button>
      </div>
   `
   document.getElementById("hud-menu-settings").childNodes[3].innerHTML = "Bad Hack by ︵ℌαʋү༉"
   document.getElementsByClassName("hud-settings-grid")[0].innerHTML = settingsHTML;
   document.getElementById('lagspam-btn').addEventListener('click', lagSpam)
   document.getElementById('lagspam-btn').addEventListener('click', lagSpambtn)
   document.getElementById("spamallparty-btn").addEventListener("click", spamAllParty);
   document.getElementById("newtab").addEventListener("click", () => window.open(`http://zombs.io/#/${game.options.serverId}/${game.ui.getPlayerPartyShareKey()}`));
   document.getElementById("autoupgradeall-btn").addEventListener("click", autoUpgradeAll);
   document.getElementById("autoupgradeall-btn").addEventListener("click", autoUpgradeAllbtn);
   document.getElementById("spampartybyid-btn").addEventListener("click", spamPartyByID);
   document.getElementById("autoaccept-btn").addEventListener("click", autoAcceptParty);
   document.getElementById("autoaccept-btn").addEventListener("click", autoAcceptPartybtn);
   document.getElementById("toggleswing").addEventListener("click", toggleSwing)
   document.getElementById("toggleahrc").addEventListener("click", toggleAHRC)
   document.getElementById("toggleresp").addEventListener('click', toggleRespawn)
   document.getElementById("toggleaim").addEventListener("click", toggleAim)
   document.getElementById("togglerb").addEventListener("click", toggleRebuild);
   document.getElementById("togglespinner").addEventListener("click", spinnerbtn);
   document.getElementById("healplayer").addEventListener("click", toggleHealPlayer);
   document.getElementById("healpet").addEventListener("click", toggleHealPet);
   document.getElementById("revivepet").addEventListener("click", toggleRevivePet);
   document.getElementById("evolvepet").addEventListener("click", toggleEvolvePet);
   document.getElementById("sellwall").addEventListener('click', () => { sellAllByType("Wall") });
   document.getElementById("selldoor").addEventListener('click', () => { sellAllByType("Door") });
   document.getElementById("selltrap").addEventListener('click', () => { sellAllByType("SlowTrap") });
   document.getElementById("sellarrow").addEventListener('click', () => { sellAllByType("ArrowTower") });
   document.getElementById("sellcannon").addEventListener('click', () => { sellAllByType("CannonTower") });
   document.getElementById("sellmelee").addEventListener('click', () => { sellAllByType("MeleeTower") });
   document.getElementById("sellbomb").addEventListener('click', () => { sellAllByType("BombTower") });
   document.getElementById("sellmagic").addEventListener('click', () => { sellAllByType("MagicTower") });
   document.getElementById("sellminer").addEventListener('click', () => { sellAllByType("GoldMine") });
   document.getElementById("sellharvester").addEventListener('click', () => { sellAllByType("Harvester") });
   document.getElementById("hidechat").addEventListener("click", hideChat);
   document.getElementById("hidepop").addEventListener("click", hidePopupOverlay);
   document.getElementById("hideldb").addEventListener("click", hideLeaderboard);
   document.getElementById("hidemap").addEventListener("click", hideMap);
   document.getElementById("hidepip").addEventListener("click", hidePIP);
   document.getElementById("hideground").addEventListener("click", hideGround);
   document.getElementById("hidenpcs").addEventListener("click", hideNPCs);
   document.getElementById("hideenv").addEventListener("click", hideEnviroment);
   document.getElementById("hideproj").addEventListener("click", hideProjectiles);
   document.getElementById("hideall").addEventListener("click", hideAll);
   document.getElementById("freezegame").addEventListener("click", freezeGame);
   document.getElementById('clearchat-btn').addEventListener('click', clearChatbtn)

   function hideGround() {
      if (document.getElementById("hideground").innerHTML == "Show Ground") {
         document.getElementById("hideground").innerHTML = "Hide Ground"
         game.renderer.ground.setVisible(true)
      } else {
         document.getElementById("hideground").innerHTML = "Show Ground"
         game.renderer.ground.setVisible(false)
      }
   }

   function hideNPCs() {
      if (document.getElementById("hidenpcs").innerHTML == "Show NPCs") {
         document.getElementById("hidenpcs").innerHTML = "Hide NPCs"
         game.renderer.npcs.setVisible(true)
      } else {
         document.getElementById("hidenpcs").innerHTML = "Show NPCs"
         game.renderer.npcs.setVisible(false)
      }
   }

   function hideEnviroment() {
      if (document.getElementById("hideenv").innerHTML == "Show Env") {
         document.getElementById("hideenv").innerHTML = "Hide Env"
         game.renderer.scenery.setVisible(true)
      } else {
         document.getElementById("hideenv").innerHTML = "Show Env"
         game.renderer.scenery.setVisible(false)
      }
   }

   function hideProjectiles() {
      if (document.getElementById("hideproj").innerHTML == "Show Proj") {
         document.getElementById("hideproj").innerHTML = "Hide Proj"
         game.renderer.projectiles.setVisible(true)
      } else {
         document.getElementById("hideproj").innerHTML = "Show Proj"
         game.renderer.projectiles.setVisible(false)
      }
   }

   function hideAll() {
      if (document.getElementById("hideall").innerHTML == "Show All") {
         document.getElementById("hideall").innerHTML = "Hide All"
         game.renderer.scene.setVisible(true)
      } else {
         document.getElementById("hideall").innerHTML = "Show All"
         game.renderer.scene.setVisible(false)
      }
   }

   function freezeGame() {
      if (document.getElementById("freezegame").innerHTML == "Start Game") {
         document.getElementById("freezegame").innerHTML = "Stop Game"
         game.start()
      } else {
         document.getElementById("freezegame").innerHTML = "Start Game"
         game.stop()
      }
   }

   game.network.addRpcHandler("LocalBuilding", (data) => {
      for (let e of data) {
         if (!!e.dead) {
            for (let i of uniqueSellUid) {
               if (e.uid == i) {
                  uniqueSellUid.splice(uniqueSellUid.indexOf(i, 0), 1)
               }
            };
         }
      }
   })
   let sellUid = []
   let uniqueSellUid = []
   function sellAllByType(type) {
      for (let i of Object.values(game.ui.buildings)) {
         if (Object.values(i)[2] == type) {
            sellUid.push(Object.values(i)[4])
         }
      }
      uniqueSellUid = [...new Set([...uniqueSellUid, ...sellUid])]
      sellUid = []
      let sellInterval = setInterval(() => {
         if (uniqueSellUid.length > 0 && game.ui.playerPartyCanSell) {
            game.network.sendRpc({
               name: "DeleteBuilding",
               uid: parseInt(uniqueSellUid[Math.floor(Math.random() * uniqueSellUid.length)])
            })
         } else {
            clearInterval(sellInterval)
         }
      }, 50);
   }

   document.getElementById("sellall").addEventListener('click', function () {
      Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to delete all towers?", 6000, function () {
         for (let i of Object.values(game.ui.buildings)) {
            if (Object.values(i)[2] != "GoldStash") {
               sellUid.push(Object.values(i)[4])
            }
         }
         uniqueSellUid = [...new Set([...uniqueSellUid, ...sellUid])]
         sellUid = []
         let sellInterval = setInterval(() => {
            if (uniqueSellUid.length > 0 && game.ui.playerPartyCanSell) {
               game.network.sendRpc({
                  name: "DeleteBuilding",
                  uid: parseInt(uniqueSellUid[Math.floor(Math.random() * uniqueSellUid.length)])
               })
            } else {
               clearInterval(sellInterval)
            }
         }, 50);
      })
   })

   let shouldAutoRespawn = false
   game.network.addRpcHandler("Dead", () => {
      if (shouldAutoRespawn) {
         game.network.sendPacket(3, { respawn: 1 })
         document.getElementById('hud-respawn').style.display = "none"
      }
   })

   function hideChat() {
      if (document.getElementsByClassName("hud-top-left")[0].style.display === "none" && document.getElementById("hidechat").innerHTML == "Show Chat") {
         document.getElementsByClassName("hud-top-left")[0].style.display = "block";
         document.getElementById("hidechat").innerHTML = "Hide Chat";
      } else {
         document.getElementsByClassName("hud-top-left")[0].style.display = "none";
         document.getElementById("hidechat").innerHTML = "Show Chat";
      }
   }

   function hidePopupOverlay() {
      if (document.getElementById("hud-popup-overlay").style.display === "none" && document.getElementById("hidepop").innerHTML == "Show Popup") {
         document.getElementById("hud-popup-overlay").style.display = "block";
         document.getElementById("hidepop").innerHTML = "Hide Popup";
      } else {
         document.getElementById("hud-popup-overlay").style.display = "none";
         document.getElementById("hidepop").innerHTML = "Show Popup";
      }
   }

   function hideLeaderboard() {
      if (document.getElementById("hud-leaderboard").style.display === "none" && document.getElementById("hideldb").innerHTML == "Show Leaderboard") {
         document.getElementById("hud-leaderboard").style.display = "block";
         document.getElementById("hideldb").innerHTML = "Hide Leaderboard";
      } else {
         document.getElementById("hud-leaderboard").style.display = "none";
         document.getElementById("hideldb").innerHTML = "Show Leaderboard";
      }
   }

   function hideMap() {
      if (document.getElementsByClassName("hud-bottom-left")[0].style.display === "none" && document.getElementById("hidemap").innerHTML == "Show Map") {
         document.getElementsByClassName("hud-bottom-left")[0].style.display = "block";
         document.getElementById("hidemap").innerHTML = "Hide Map";
      } else {
         document.getElementsByClassName("hud-bottom-left")[0].style.display = "none";
         document.getElementById("hidemap").innerHTML = "Show Map";
      }
   }

   function hidePIP() {
      if (document.getElementsByClassName("hud-pip-overlay")[0].style.display === "block" || document.getElementsByClassName("hud-pip-overlay")[0].style.display === "") {
         document.getElementsByClassName("hud-pip-overlay")[0].style.display = "none";
         document.getElementById("hidepip").innerHTML = "Show PIP";
      } else {
         document.getElementsByClassName("hud-pip-overlay")[0].style.display = "block";
         document.getElementById("hidepip").innerHTML = "Hide PIP";
      }
   }

   function lagSpambtn() {
      if (document.getElementById("lagspam-btn").innerHTML == "Lag Spam On") {
         document.getElementById("lagspam-btn").innerHTML = "Lag Spam Off";
      } else {
         document.getElementById("lagspam-btn").innerHTML = "Lag Spam On";
      }
   }
   let availableCharacters = ""
   let textLength = 70;
   fetch('https://raw.githubusercontent.com/bits/UTF-8-Unicode-Test-Documents/master/UTF-8_sequence_unseparated/utf8_sequence_0-0xffff_assigned_printable_unseparated.txt')
      .then(response => response.text())
      .then(data => {
         availableCharacters = data;
      });

   var chatSpam = null;

   function lagSpam() {
      clearInterval(chatSpam);
      if (chatSpam !== null) {
         chatSpam = null;
      } else {
         chatSpam = setInterval(function () {
            let text = ""
            for (let i = 0; i < textLength; i++) text += availableCharacters[Math.floor(Math.random() * availableCharacters.length)];
            game.network.sendRpc({
               name: "SendChatMessage",
               channel: "Local",
               message: text
            });
         }, 1050);
      };
   };

   function spamAllParty() {
      if (document.getElementById("spamallparty-btn").innerHTML == "Spam All Party On") {
         document.getElementById("spamallparty-btn").innerHTML = "Spam All Party Off";
         shouldSpamAllParty = false
      } else {
         document.getElementById("spamallparty-btn").innerHTML = "Spam All Party On";
         shouldSpamAllParty = true
      }
   }

   function autoAcceptPartybtn() {
      if (document.getElementById("autoaccept-btn").innerHTML == "Accepter On") {
         document.getElementById("autoaccept-btn").innerHTML = "Accepter Off";
      } else {
         document.getElementById("autoaccept-btn").innerHTML = "Accepter On";
      }
   }
   var acceptparty = null;

   function autoAcceptParty() {
      clearInterval(acceptparty);
      if (acceptparty !== null) {
         acceptparty = null;
      } else {
         acceptparty = setInterval(function () {
            var confirm = document.getElementsByClassName("btn btn-green hud-confirmation-accept");
            for (var j = 0; j < confirm.length; j++) {
               confirm[j].click();
            }
         }, 100);
      }
   }

   function autoUpgradeAllbtn() {
      if (document.getElementById("autoupgradeall-btn").innerHTML == "Upgrade On") {
         document.getElementById("autoupgradeall-btn").innerHTML = "Upgrade Off";
      } else {
         document.getElementById("autoupgradeall-btn").innerHTML = "Upgrade On";
      }
   }
   var autoupgradeall = null;

   function autoUpgradeAll() {
      clearInterval(autoupgradeall);
      if (autoupgradeall !== null) {
         autoupgradeall = null;
      } else {
         autoupgradeall = setInterval(function () {
            var entities = Game.currentGame.world.entities;
            for (var uid in entities) {
               if (!entities.hasOwnProperty(uid)) continue;
               var obj = entities[uid];
               Game.currentGame.network.sendRpc({
                  name: "UpgradeBuilding",
                  uid: obj.fromTick.uid
               })
            }
         }, 1000)
      }
   }

   function spamPartyByID() {
      if (document.getElementById("spampartybyid-btn").innerHTML == "Spam Party By ID On") {
         shouldSpamIdParty = false
         document.getElementById("spampartybyid-btn").innerHTML = "Spam Party By ID Off";
      } else {
         shouldSpamIdParty = true
         document.getElementById("spampartybyid-btn").innerHTML = "Spam Party By ID On";
      }
   }

   function clearChatbtn() {
      if (document.getElementById("clearchat-btn").innerHTML == "Clear Chat On") {
         document.getElementById("clearchat-btn").innerHTML = "Clear Chat Off";
         shouldClearChat = false
      } else {
         document.getElementById("clearchat-btn").innerHTML = "Clear Chat On";
         shouldClearChat = true
      }
   }

   function spinnerbtn() {
      if (document.getElementById("togglespinner").innerHTML == "Spinner On") {
         document.getElementById("togglespinner").innerHTML = "Spinner Off";
         shouldSpin = false
         yaw = game.ui.playerTick.aimingYaw
      } else {
         document.getElementById("togglespinner").innerHTML = "Spinner On";
         shouldSpin = true
         yaw = game.ui.playerTick.aimingYaw
      }
   }

   function toggleRebuild() {
      if (!shouldAutoRebuild) {
         deadTowers = []
         shouldAutoRebuild = true
         document.getElementById("togglerb").innerHTML = "Rebuild On";
      } else {
         deadTowers = []
         shouldAutoRebuild = false
         document.getElementById("togglerb").innerHTML = "Rebuild Off";
      }
   }

   function toggleSwing() {
      if (!autoSwing) {
         autoSwing = true;
         document.getElementById("toggleswing").innerHTML = "Swing On";
      } else {
         autoSwing = false;
         document.getElementById("toggleswing").innerHTML = "Swing Off";
      }
   }

   function toggleAHRC() {
      if (!shouldAHRC) {
         shouldAHRC = true;
         document.getElementById("toggleahrc").innerHTML = "AHRC On";
      } else {
         shouldAHRC = false;
         document.getElementById("toggleahrc").innerHTML = "AHRC Off";
      }
   }

   function toggleRespawn() {
      if (!shouldAutoRespawn) {
         shouldAutoRespawn = true;
         document.getElementById("toggleresp").innerHTML = "Respawn On";
      } else {
         shouldAutoRespawn = false;
         document.getElementById("toggleresp").innerHTML = "Respawn Off";
      }
   }

   function toggleAim() {
      if (!shouldAutoAim) {
         shouldAutoAim = true;
         document.getElementById("toggleaim").innerHTML = "Aim On";
      } else {
         shouldAutoAim = false;
         document.getElementById("toggleaim").innerHTML = "Aim Off";
      }
   }

   function toggleHealPet() {
      if (!shouldAutoHealPet) {
         shouldAutoHealPet = true;
         document.getElementById("healpet").innerHTML = "Heal Pet On";
      } else {
         shouldAutoHealPet = false;
         document.getElementById("healpet").innerHTML = "Heal Pet Off";
      }
   }

   function toggleRevivePet() {
      if (!shouldAutoRevivePet) {
         shouldAutoRevivePet = true
         document.getElementById("revivepet").innerHTML = "Revive On";
      } else {
         shouldAutoRevivePet = false
         document.getElementById("revivepet").innerHTML = "Revive Off";
      }
   }

   function toggleEvolvePet() {
      if (!shouldAutoEvolvePet) {
         shouldAutoEvolvePet = true
         document.getElementById("evolvepet").innerHTML = "Evolve On";
      } else {
         shouldAutoEvolvePet = false
         document.getElementById("evolvepet").innerHTML = "Evolve Off";
      }
   }

   function toggleHealPlayer() {
      if (!shouldAutoHealPlayer) {
         shouldAutoHealPlayer = true
         document.getElementById("healplayer").innerHTML = "Heal Player On"
      } else {
         shouldAutoHealPlayer = false
         document.getElementById("healplayer").innerHTML = "Heal Player Off"
      }
   }

   function move(direction) {
      switch (direction) {
         case 'Up': {
            game.inputPacketScheduler.scheduleInput({ up: 1, down: 0, left: 0, right: 0 })
            break
         }
         case 'Down': {
            game.inputPacketScheduler.scheduleInput({ up: 0, down: 1, left: 0, right: 0 })
            break
         }
         case 'Left': {
            game.inputPacketScheduler.scheduleInput({ up: 0, down: 0, left: 1, right: 0 })
            break
         }
         case 'Right': {
            game.inputPacketScheduler.scheduleInput({ up: 0, down: 0, left: 0, right: 1 })
            break
         }
         case 'UpRight': {
            game.inputPacketScheduler.scheduleInput({ up: 1, down: 0, left: 0, right: 1 })
            break
         }
         case 'UpLeft': {
            game.inputPacketScheduler.scheduleInput({ up: 1, down: 0, left: 1, right: 0 })
            break
         }
         case 'DownRight': {
            game.inputPacketScheduler.scheduleInput({ up: 0, down: 1, left: 0, right: 1 })
            break
         }
         case 'DownLeft': {
            game.inputPacketScheduler.scheduleInput({ up: 0, down: 1, left: 1, right: 0 })
            break
         }
      }
   }

   let yaw
   let lockedYaw
   let shouldSpin = false
   let shouldClearChat = false
   let shouldSpamIdParty = false
   let shouldSpamAllParty = false
   let shouldLockYaw = false
   let shouldAutoRebuild = false
   let autoBuildTimeout = false
   let autoSwing = false
   let shouldBotMode = false
   let botTimeout = false
   let shouldAHRC = false
   let shouldAutoAim = false
   let shouldAutoHealPet = true
   let healPetTimeout = false
   let shouldAutoRevivePet = true
   let shouldAutoEvolvePet = true
   let shouldAutoHealPlayer = true
   let playerHealTimeout = false
   let petSpawned = false
   game.network.addEntityUpdateHandler((data) => {
      if (game.world.inWorld && game.network.connected) {
         let myPet = game.world.entities[game.ui.playerTick?.petUid]?.fromTick;
         let petHealth = (myPet?.health / myPet?.maxHealth) * 100;
         let myPlayer = game.world.entities[game.ui.playerTick?.uid]?.fromTick;
         let playerHealth = (myPlayer?.health / myPlayer?.maxHealth) * 100;

         if (game.ui.playerTick?.petUid != 0 && game.ui.playerTick?.petUid != undefined) petSpawned = true;
         if (shouldAutoHealPet && petHealth < document.getElementById("healpetinput").value && petHealth > 0 && game.ui.playerTick.gold >= 100 && !healPetTimeout) {
            shopShortcut("PetHealthPotion", 1)
            healPetTimeout = true;
            setTimeout(() => {
               healPetTimeout = false;
            }, 300);

         }
         if (shouldAutoEvolvePet && petHealth > 0 && game.world.entities[game.ui.playerTick?.uid]?.fromTick?.health > 0) {
            let model = game.world.entities[game.ui.playerTick?.petUid]?.fromTick?.model
            let tokens = document.querySelectorAll(".hud-shop-item-tokens")
            let pToken = game.ui.playerTick.token
            let evolvebtn = document.querySelectorAll(".hud-shop-actions-evolve")
            if (!evolvebtn[0].classList[1] && pToken >= tokens[0].innerHTML && model == "PetCARL") {
               buyItem("PetCARL", getPetTier(5))
            }
            if (!evolvebtn[1].classList[1] && pToken >= tokens[1].innerHTML && model == "PetMiner") {
               buyItem("PetMiner", getPetTier(6))
            }
         }
         if (petSpawned == true && shouldAutoRevivePet && !game.world.entities[game.ui.playerTick?.petUid] && playerHealth > 0) {
            shopShortcut("PetRevive", 1)
         }

         if (playerHealth <= document.getElementById("healplayerinput").value && playerHealth > 0 && game.ui.playerTick.gold >= 100 && shouldAutoHealPlayer && !playerHealTimeout) {
            shopShortcut("HealthPotion", 1)
            playerHealTimeout = true;
            setTimeout(() => {
               playerHealTimeout = false;
            }, 300)
         }
         if (shouldAHRC) {
            let entities = Game.currentGame.world.entities;
            for (let uid in entities) {
               let obj = entities[uid];
               if (obj.fromTick.model == "Harvester") {
                  let amount = obj.fromTick.tier * 0.05 - 0.02;
                  game.network.sendRpc({ name: "AddDepositToHarvester", uid: obj.fromTick.uid, deposit: amount });
                  game.network.sendRpc({ name: "CollectHarvester", uid: obj.fromTick.uid });
               };
            };
         };
         if (shouldAutoAim) {
            window.targets = [];
            let entities = game.renderer.npcs.attachments;
            for (let i in entities) {
               if (document.getElementById('aimOptions').value == 'pl' ?
                  (entities[i].fromTick.model == "GamePlayer" && entities[i].fromTick.uid !== game.ui.playerTick.uid && entities[i].targetTick.partyId !== game.ui.playerPartyId && entities[i].fromTick.dead == 0) :
                  (entities[i].fromTick.model !== "GamePlayer" && entities[i].entityClass !== "Projectile")) {
                  window.targets.push(entities[i].fromTick);
               };
            };
            if (window.targets.length > 0) {
               const myPos = game.ui.playerTick.position;
               window.targets.sort((a, b) => {
                  return measureDistance(myPos, a.position) - measureDistance(myPos, b.position);
               });

               const target = window.targets[0];
               let reversedAim = game.inputPacketCreator.screenToYaw((target.position.x - myPos.x) * 100, (target.position.y - myPos.y) * 100);
               game.inputPacketCreator.lastAnyYaw = reversedAim;
               game.network.sendPacket(3, { mouseMoved: reversedAim });
            }
         };
         if (autoSwing) {
            game.network.sendInput({ space: 0 })
            game.network.sendInput({ space: 1 })
         }
         if (shouldLockYaw && game.ui.playerTick?.aimingYaw != lockedYaw) {
            game.inputPacketCreator.lastAnyYaw = lockedYaw;
            game.network.sendPacket(3, { mouseMoved: lockedYaw });
         }
         if (shouldAutoRebuild && deadTowers.length > 0 && !autoBuildTimeout) {
            console.log('rebuild')
            autoBuildTimeout = true
            for (let i of deadTowers) {
               game.network.sendRpc({
                  name: "MakeBuilding",
                  type: i[0],
                  x: i[1],
                  y: i[2],
                  yaw: i[3],
               });
            };
            setTimeout(() => {
               autoBuildTimeout = false;
            }, 1000)
         }
         if (shouldBotMode && botTimeout == false) {
            botTimeout = true
            move(['Up', 'Down', 'Left', 'Right', 'UpRight', 'UpLeft', 'DownRight', 'DownLeft'][Math.floor(Math.random() * 8)])
            setTimeout(() => {
               botTimeout = false
            }, 1000);
         }
         if (shouldSpamAllParty) {
            let joinablePartyId = []
            let allparty = Object.values(game.ui.getParties())
            for (let party of allparty) {
               if (party.isOpen == 1 && party.memberCount < 4 && party.partyId != game.ui.getPlayerPartyId()) joinablePartyId.push(party.partyId)
            }
            if (joinablePartyId.length > 0) game.network.sendRpc({ name: 'JoinParty', partyId: joinablePartyId[Math.floor(Math.random() * joinablePartyId.length)] })
         }
         if (shouldSpin) {
            game.inputPacketCreator.lastAnyYaw = yaw;
            game.network.sendPacket(3, { mouseMoved: yaw });
            yaw += 10
            if (yaw >= 360) yaw -= 360
         }
         if (shouldSpamIdParty && document.querySelector("#party-id-input").value != '') game.network.sendRpc({ name: "JoinParty", partyId: parseInt(document.querySelector("#party-id-input").value) })
         if (shouldClearChat && document.querySelector('.hud-chat-messages').childElementCount > 0) document.querySelector('.hud-chat-messages').innerHTML = ""
      }
   })

   let deadTowers = []
   game.network.addRpcHandler("LocalBuilding", (data) => {
      if (shouldAutoRebuild) {
         for (let e of data) {
            if (!!e.dead) {
               let yaw = 0;
               if (["Harvester", "MeleeTower"].includes(e.type)) {
                  if (game.world.entities[e.uid] !== undefined) yaw = game.world.entities[e.uid].targetTick.yaw;
               }
               deadTowers.push([e.type, e.x, e.y, yaw, e.tier])
            };
            for (let i of deadTowers) {
               if (e.type == i[0] && e.x == i[1] && e.y == i[2] && e.dead == 0) {
                  deadTowers.splice(deadTowers.indexOf(i, 0), 1)
               }
            };
            if (e.type == "GoldStash") deadTowers = []
         }
      };
   });

   let mousePs = {};
   let should3x3Walls = false;
   let should5x5Walls = false;
   let should7x7Walls = false;
   let should9x9Walls = false;

   addEventListener('keydown', function (e) {
      if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
         if (e.key == "z" && !should3x3Walls) {
            game.ui.getComponent("PopupOverlay").showHint('3x3 Walls On', 1000)
            should3x3Walls = true;
            should5x5Walls = false;
            should7x7Walls = false;
            should9x9Walls = false;
         }
         if (e.key == "x" && !should5x5Walls) {
            game.ui.getComponent("PopupOverlay").showHint('5x5 Walls On', 1000)
            should3x3Walls = false;
            should5x5Walls = true;
            should7x7Walls = false;
            should9x9Walls = false;
         }
         if (e.key == "c" && !should7x7Walls) {
            game.ui.getComponent("PopupOverlay").showHint('7x7 Walls On', 1000)
            should3x3Walls = false;
            should5x5Walls = false;
            should7x7Walls = true;
            should9x9Walls = false;
         }
         if (e.key == "v" && !should9x9Walls) {
            game.ui.getComponent("PopupOverlay").showHint('9x9 Walls On', 1000)
            should3x3Walls = false;
            should5x5Walls = false;
            should7x7Walls = false;
            should9x9Walls = true;
         }
      }
   })

   addEventListener('keyup', function (e) {
      if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
         if (e.key == "z") {
            should3x3Walls = false;
         }
         if (e.key == "x") {
            should5x5Walls = false;
         }
         if (e.key == "c") {
            should7x7Walls = false;
         }
         if (e.key == "v") {
            should9x9Walls = false;
         }
      }
   })

   function placeWall(x, y) {
      game.network.sendRpc({ name: 'MakeBuilding', x: x, y: y, type: "Wall", yaw: 0 });
   }

   document.addEventListener('mousemove', e => {
      mousePs = { x: e.clientX, y: e.clientY };
      if (game.inputManager.mouseDown && game.ui.components.PlacementOverlay.buildingId == "Wall") {
         var buildingSchema = game.ui.getBuildingSchema();
         var schemaData = buildingSchema.Wall;
         var world = game.world;
         var worldPos = game.renderer.screenToWorld(mousePs.x, mousePs.y);
         var cellIndexes = world.entityGrid.getCellIndexes(worldPos.x, worldPos.y, { width: schemaData.gridWidth, height: schemaData.gridHeight });
         var cellSize = world.entityGrid.getCellSize();
         var cellAverages = { x: 0, y: 0 };
         for (var i in cellIndexes) {
            if (!cellIndexes[i]) {
               return false;
            }
            var cellPos = world.entityGrid.getCellCoords(cellIndexes[i]);
            cellAverages.x += cellPos.x;
            cellAverages.y += cellPos.y;
         }
         cellAverages.x = cellAverages.x / cellIndexes.length;
         cellAverages.y = cellAverages.y / cellIndexes.length;
         var gridPos = {
            x: cellAverages.x * cellSize + cellSize / 2,
            y: cellAverages.y * cellSize + cellSize / 2
         };
         if (should3x3Walls) {
            //layer 1
            placeWall(gridPos.x - 48, gridPos.y + 48);
            placeWall(gridPos.x, gridPos.y + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48);
            //layer 2
            placeWall(gridPos.x - 48, gridPos.y);
            placeWall(gridPos.x, gridPos.y);
            placeWall(gridPos.x + 48, gridPos.y);
            //layer 3
            placeWall(gridPos.x - 48, gridPos.y - 48);
            placeWall(gridPos.x, gridPos.y - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48);
         }
         if (should5x5Walls) {
            //layer 1
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48);
            //layer 2
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48);
            placeWall(gridPos.x, gridPos.y + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48);
            //layer 3
            placeWall(gridPos.x - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48, gridPos.y);
            placeWall(gridPos.x, gridPos.y);
            placeWall(gridPos.x + 48, gridPos.y);
            placeWall(gridPos.x + 48 + 48, gridPos.y);
            //layer 4
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48);
            placeWall(gridPos.x, gridPos.y - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48);
            //layer 5
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48);
         }
         if (should7x7Walls) {
            //layer 1
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48 + 48 + 48);
            //layer 2
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48 + 48);
            //layer 3
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48);
            placeWall(gridPos.x, gridPos.y + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48);
            //layer 4
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48, gridPos.y);
            placeWall(gridPos.x, gridPos.y);
            placeWall(gridPos.x + 48, gridPos.y);
            placeWall(gridPos.x + 48 + 48, gridPos.y);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y);
            //layer 5
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48);
            placeWall(gridPos.x, gridPos.y - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48);
            //layer 6
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48 - 48);
            //layer 7
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48 - 48 - 48);
         }
         if (should9x9Walls) {
            //layer 1
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48 + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y + 48 + 48 + 48 + 48);
            //layer 2
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48 + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y + 48 + 48 + 48);
            //layer 3
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48 + 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y + 48 + 48);
            //layer 4
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y + 48);
            placeWall(gridPos.x - 48, gridPos.y + 48);
            placeWall(gridPos.x, gridPos.y + 48);
            placeWall(gridPos.x + 48, gridPos.y + 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y + 48)
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y + 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y + 48);
            //layer 5
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48 - 48, gridPos.y);
            placeWall(gridPos.x - 48, gridPos.y);
            placeWall(gridPos.x, gridPos.y);
            placeWall(gridPos.x + 48, gridPos.y);
            placeWall(gridPos.x + 48 + 48, gridPos.y)
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y);
            //layer 6
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48);
            placeWall(gridPos.x, gridPos.y - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48)
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y - 48);
            //layer 7
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y - 48 - 48);
            //layer 8
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y - 48 - 48 - 48);
            //layer 9
            placeWall(gridPos.x - 48 - 48 - 48 - 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x - 48 - 48 - 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x - 48 - 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x - 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x + 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48, gridPos.y - 48 - 48 - 48 - 48);
            placeWall(gridPos.x + 48 + 48 + 48 + 48, gridPos.y - 48 - 48 - 48 - 48);
         }
      }
   })

   let dimension = 1;
   const onWindowResize = () => {
      if (document.querySelector("#hud-menu-settings").style.display == "none") {
         const renderer = Game.currentGame.renderer;
         let canvasWidth = window.innerWidth * window.devicePixelRatio;
         let canvasHeight = window.innerHeight * window.devicePixelRatio;
         let ratio = canvasHeight / (1080 * dimension);
         renderer.scale = ratio;
         renderer.entities.setScale(ratio);
         renderer.ui.setScale(ratio);
         renderer.renderer.resize(canvasWidth, canvasHeight);
         renderer.viewport.width = renderer.renderer.width / renderer.scale + 2 * renderer.viewportPadding;
         renderer.viewport.height = renderer.renderer.height / renderer.scale + 2 * renderer.viewportPadding;
      }
   } // Zoom by Apex, modified by eh
   onWindowResize();
   window.onresize = onWindowResize;
   window.onwheel = e => {
      if (e.deltaY > 0) {
         dimension += 0.09;
         onWindowResize();
      } else if (e.deltaY < 0) {
         dimension -= 0.09;
         onWindowResize();
      }
   }

   function measureDistance(obj1, obj2) {
      if (!(obj1.x && obj1.y && obj2.x && obj2.y)) return Infinity;
      let xDif = obj2.x - obj1.x;
      let yDif = obj2.y - obj1.y;
      return Math.abs((xDif ** 2) + (yDif ** 2));
   };

   addEventListener('keyup', function (e) {
      if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
         if (e.key == "=") {
            game.ui.getComponent("PopupOverlay").showHint(
               'Press [/] for menu, press [?] to lock angle, type !boss for boss wave, !marker to leave a mark on map, left click somewhere on the minimap to automatically move there, HOLD "c" for 3x3 wall, "x" for 5x5 and "z" for 7x7',
               1.5e4
            )
         }
         if (e.key == "/") {
            document.querySelector("#hud-menu-settings")
               .style.display = document.querySelector("#hud-menu-settings")
                  .style.display == "none" ? "block" : "none"
            document.querySelector("#hud-menu-shop")
               .style.display = "none"
            document.querySelector("#hud-menu-party")
               .style.display = "none"
         }
         if (e.key == "`") {
            game.inputManager.onKeyRelease({
               keyCode: 117
            })
         }
         if (e.keyCode == 27) {
            let mb = document.getElementsByClassName("hud")[0];
            if (mb.style.display === "none") {
               mb.style.display = "block";
            } else {
               mb.style.display = "none";
            };
         }
         if (e.key == "?") {
            if (!shouldLockYaw) {
               lockedYaw = game.ui.playerTick.aimingYaw
               shouldLockYaw = true
               game.ui.getComponent("PopupOverlay").showHint('Yaw locked, press [?] to unlock', 1.5e4)
            } else {
               shouldLockYaw = false
               game.ui.getComponent("PopupOverlay").showHint('Yaw unlocked', 1.5e4)
            }
         }
      }
   })

   document.querySelector('#togglebot').addEventListener('click', function () {
      shouldBotMode = !shouldBotMode
      this.innerText = shouldBotMode ? "Bot On" : "Bot Off"
   })
   document.querySelector('#togglespmch').addEventListener('click', function () {
      pauseChatSpam(document.querySelector('#spamchat').value)
      this.innerText = isSpamming ? "Spam Chat On" : "Spam Chat Off"
   })

   let blockedNames = [];

   function blockPlayer(name) {
      blockedNames.push(name);
      for (let msg of Array.from(document.getElementsByClassName("hud-chat-message"))) {
         if (msg.childNodes[0].childNodes[1].textContent == name) {
            let bl = msg.childNodes[0].childNodes[0];
            bl.innerHTML = "🔴 ";
            bl.onclick = () => {
               unblockPlayer(name);
            };
         };
      };
   }

   function unblockPlayer(name) {
      blockedNames.splice(blockedNames.indexOf(name), 1);
      for (let msg of Array.from(document.getElementsByClassName("hud-chat-message"))) {
         if (msg.childNodes[0].childNodes[1].textContent == name) {
            let bl = msg.childNodes[0].childNodes[0];
            bl.innerHTML = "🟢 ";
            bl.onclick = () => {
               blockPlayer(name);
            };
         };
      };
   };

   const getClock = () => {
      var date = new Date();
      var day = date.getDate();
      var month = date.getMonth();
      var hour = date.getHours();
      var minute = date.getMinutes()
      var second = date.getSeconds();

      hour = (hour < 10) ? "0" + hour : hour;
      minute = (minute < 10) ? "0" + minute : minute;
      second = (second < 10) ? "0" + second : second;
      return `${day}/${month} ${hour}:${minute}:${second}`;
   }

   Game.currentGame.network.emitter.removeListener("PACKET_RPC", Game.currentGame.network.emitter._events.PACKET_RPC[1]);
   let onMessageReceived = msg => {
      let a = Game.currentGame.ui.getComponent("Chat"),
         b = msg.displayName.replace(/<(?:.|\n)*?>/gm, ''),
         c = msg.message.replace(/<(?:.|\n)*?>/gm, '')
      if (blockedNames.includes(b) || window.chatDisabled) { return; };
      let d = a.ui.createElement(`<div class="hud-chat-message"><strong><a>🟢 </a>${b}</strong><small> at ${getClock()}</small>: ${c}</div>`);
      a.messagesElem.appendChild(d);
      a.messagesElem.scrollTop = a.messagesElem.scrollHeight;
      a.messagesElem.lastChild.childNodes[0].childNodes[0].onclick = () => { blockPlayer(b) }
   }
   Game.currentGame.network.addRpcHandler("ReceiveChatMessage", onMessageReceived);

   let goToPosInterval
   let moveTimeout
   function goToPos(x, y) {
      clearInterval(goToPosInterval)
      goToPosInterval = setInterval(() => {
         let myX = Math.round(game.ui.playerTick.position.x);
         let myY = Math.round(game.ui.playerTick.position.y);

         let offset = 100;

         if (-myX + x > offset) game.network.sendInput({ left: 0 }); else game.network.sendInput({ left: 1 });
         if (myX - x > offset) game.network.sendInput({ right: 0 }); else game.network.sendInput({ right: 1 });

         if (-myY + y > offset) game.network.sendInput({ up: 0 }); else game.network.sendInput({ up: 1 });
         if (myY - y > offset) game.network.sendInput({ down: 0 }); else game.network.sendInput({ down: 1 });

         if (-myX + x < offset && myX - x < offset && -myY + y < offset && myY - y < offset) {
            game.ui.getComponent('PopupOverlay').showHint('Finished moving!', 1e4)
            clearInterval(goToPosInterval)
            clearTimeout(moveTimeout)
         }
      }, 50)
      moveTimeout = setTimeout(() => {
         clearInterval(goToPosInterval)
         game.ui.getComponent('PopupOverlay').showHint('It has been 4 minutes to move to the position on the map, so it has automatically stopped to prevent infinite loops.', 8000)
         game.network.sendInput({ left: 0, right: 0, up: 0, down: 0 })
      }, 240000)
   }

   let mapContainer = document.createElement('div')
   mapContainer.id = "hud-map-container"
   document.querySelector('.hud-bottom-left').append(mapContainer)
   $('#hud-map').appendTo(document.querySelector('#hud-map-container'))

   document.querySelector("#hud-map-container").addEventListener('click', (e) => {
      let offset = $('#hud-map-container').offset();
      let mapMouseX = e.pageX - offset.left;
      let mapMouseY = e.pageY - offset.top;
      game.ui.getComponent('PopupOverlay').showConfirmation(`Are you sure you want to move to X: ${Math.round(mapMouseX * 171.42857142857)}, Y: ${Math.round(mapMouseY * 171.42857142857)}? You can right click the minimap to cancel.`, 7500, () => {
         game.ui.getComponent('PopupOverlay').showHint('Starting MapMove...', 4000)
         goToPos(mapMouseX * 171.42857142857, mapMouseY * 171.42857142857)
      }, () => {
         game.ui.getComponent('PopupOverlay').showHint('OK, did not start MapMove', 4000)
      })
   })

   document.querySelector('#hud-map-container').addEventListener('contextmenu', () => {
      game.ui.getComponent('PopupOverlay').showConfirmation('Are you sure you want to cancel the current MapMove process?', 7500, () => {
         clearInterval(goToPosInterval)
         clearTimeout(moveTimeout)
         game.network.sendInput({ left: 0, right: 0, up: 0, down: 0 })
         game.ui.getComponent('PopupOverlay').showHint('Successfully stopped MapMover.', 4000)
      }, () => {
         game.ui.getComponent('PopupOverlay').showHint('OK, did not stop MapMover.', 4000)
      })
   })
}
Bad()