Base Saver - zombs.io

just base saver

// ==UserScript==
// @name         Base Saver - zombs.io
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  just base saver
// @author       skittle-troller
// @match        http://zombs.io/
// @icon         https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/120/samsung/220/right-pointing-magnifying-glass_1f50e.png
// @grant        none
// @require      https://greasyfork.org/scripts/47911-font-awesome-all-js/code/Font-awesome%20AllJs.js?version=275337
// ==/UserScript==

let css2 = `
.btn:hover {
cursor: pointer;
}
.btn-blue {
background-color: #144b7a;
}
.btn-blue:hover .btn-blue:active {
background-color: #4fa7ee;
}
.box {
display: block;
width: 100%;
height: 50px;
line-height: 34px;
padding: 8px 14px;
margin: 0 0 10px;
background: #eee;
border: 0;
font-size: 14px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
border-radius: 4px;
}
.codeIn, .joinOut {
height: 50px;
}
.hud-menu-zipp3 {
display: none;
position: fixed;
top: 48%;
left: 50%;
width: 600px;
height: 470px;
margin: -270px 0 0 -300px;
padding: 20px;
background: rgba(0, 0, 0, 0.6);
color: #eee;
border-radius: 4px;
z-index: 15;
}
.hud-menu-zipp3 h3 {
display: block;
margin: 0;
line-height: 20px;
}
.hud-menu-zipp3 .hud-zipp-grid3 {
display: block;
height: 380px;
padding: 10px;
margin-top: 18px;
background: rgba(0, 0, 0, 0.2);
}
.hud-spell-icons .hud-spell-icon[data-type="Zippity3"]::before {
background-image: url("https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/120/samsung/220/right-pointing-magnifying-glass_1f50e.png");
}
.hud-menu-zipp3 .hud-the-tab {
position: relative;
height: 40px;
line-height: 40px;
margin: 20px;
border: 0px solid rgb(0, 0, 0, 0);
}
.hud-menu-zipp3 .hud-the-tab {
display: block;
float: left;
padding: 0 14px;
margin: 0 1px 0 0;
font-size: 14px;
background: rgba(0, 0, 0, 0.4);
color: rgba(255, 255, 255, 0.4);
transition: all 0.15s ease-in-out;
}
.hud-menu-zipp3 .hud-the-tab:hover {
background: rgba(0, 0, 0, 0.2);
color: #eee;
cursor: pointer;
}
`;

let styles = document.createElement("style");
styles.appendChild(document.createTextNode(css2));
document.head.appendChild(styles);

// class changing
document.getElementsByClassName("hud-intro-form")[0].style.height = "300px";
document.getElementsByClassName("hud-intro-play")[0].setAttribute("class", "btn btn-blue hud-intro-play");

// spell icon
let spell = document.createElement("div");
spell.classList.add("hud-spell-icon");
spell.setAttribute("data-type", "Zippity3");
spell.classList.add("hud-zipp3-icon");
document.getElementsByClassName("hud-spell-icons")[0].appendChild(spell);

//Menu for spell icon
let modHTML = `
<div class="hud-menu-zipp3">
<br />
<div class="hud-zipp-grid3">
</div>
</div>
`;
document.body.insertAdjacentHTML("afterbegin", modHTML);
let zipz123 = document.getElementsByClassName("hud-menu-zipp3")[0];

//Onclick
document.getElementsByClassName("hud-zipp3-icon")[0].addEventListener("click", function() {
  if(zipz123.style.display == "none") {
    zipz123.style.display = "block";
    for(var i = 0; i < menus.length; i++) {
      menus[i].style.display = "none";
    }
  } else {
        zipz123.style.display = "none";
  };
});

let _menu = document.getElementsByClassName("hud-menu-icon");
let _spell = document.getElementsByClassName("hud-spell-icon");
let allIcon = [
        _menu[0],
        _menu[1],
        _menu[2],
  _spell[0],
  _spell[1]
];

allIcon.forEach(function(elem) {
        elem.addEventListener("click", function() {
                if(zipz123.style.display == "block") {
                        zipz123.style.display = "none";
                };
        });
});

// key to open and close
function modm() {
        if(zipz123.style.display == "none") {
    zipz123.style.display = "block";
    for(var i = 0; i < menus.length; i++) {
      menus[i].style.display = "none";
    }
  } else {
        zipz123.style.display = "none";
  };
};

  document.getElementsByClassName("hud-zipp-grid3")[0].innerHTML = `
<div style="text-align:center"><br>
<hr />
<h3>Base Saver <br>
<hr />
WARNING: If you place more than 225 building, it wont be saved/recorded.</h3>
<hr />
<button onclick="RecordBase();">Record Base!</button>
<button onclick="buildRecordedBase();">Build Recorded Base!</button>
<button onclick="DeleteRecordedbase();">Delete Recorded Base!</button>
<br><br>
<button onclick="saveBase();">Save Towers!</button>
<button onclick="saveTowers();">Build Saved Towers!</button>
<br><br>
<input type="number" value="275" class="SaveSpeed" placeholder="speed" style="width: 20%">
<button class="SaveSpeedbtn">save speed</button>
<button id="SSL31">Enable Auto Build Saved Towers!</button>
<br><br>
<input type="number" value="275" class="SaveSpeed2" placeholder="speed" style="width: 20%">
<button class="SaveSpeedbtn2">save speed</button>
<button id="SSL32">Enable Upgrade All!</button>
<button id="SSL33">Enable Auto Sell All!</button>
  `;
var button231 = document.getElementById("SSL31");
button231.addEventListener("click", startSSL31);
button231.addEventListener("click", stopSSL31);
var SSL31 = null;
var saveSpeed=275;
$("SaveSpeedbtn").addEventListener("click", function() {
  saveSpeed = $("SaveSpeed").value;
});

function startSSL31() {
clearInterval(SSL31);
  if (SSL31 !== null) {
    SSL31 = null;
  } else {

              SSL31 = setInterval(function() {
                 saveTowers()
           }, saveSpeed)
  }
}

         function stopSSL31() {
  var trade = document.getElementById("SSL31");
  if (trade.innerHTML == "Enable Auto Build Saved Towers!") {
    trade.innerHTML = "Disable Auto Build Saved Towers!";
  } else {
    trade.innerHTML = "Enable Auto Build Saved Towers!";
  }
}
var button233 = document.getElementById("SSL33");
button233.addEventListener("click", startSSL33);
button233.addEventListener("click", stopSSL33);
var SSL33 = null;
function startSSL33() {
clearInterval(SSL33);
  if (SSL33 !== null) {
    SSL33 = null;
  } else {

              SSL33 = setInterval(function() {
                 GoldGeneratorr()
           }, saveSpeed2)
  }
}
         function stopSSL33() {
  var trade = document.getElementById("SSL33");
  if (trade.innerHTML == "Enable Auto Sell All!") {
    trade.innerHTML = "Disable Auto Sell All!";
  } else {
    trade.innerHTML = "Enable Auto Sell All!";
  }
}
var button232 = document.getElementById("SSL32");
button232.addEventListener("click", startSSL32);
button232.addEventListener("click", stopSSL32);
var SSL32 = null;
var saveSpeed2=275;
$("SaveSpeedbtn2").addEventListener("click", function() {
  saveSpeed2 = $("SaveSpeed2").value;
});

function startSSL32() {
clearInterval(SSL32);
  if (SSL32 !== null) {
    SSL32 = null;
  } else {

              SSL32 = setInterval(function() {
        var entities = Game.currentGame.world.entities;
        for(var uid in entities) {
            if(!entities.hasOwnProperty(uid)) continue;
            var obj = entities[uid];
if(["Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester", "Wall"].indexOf(obj.fromTick.model) >= 0) {
                Game.currentGame.network.sendRpc({
                    name: "UpgradeBuilding",
                    uid: obj.fromTick.uid
                });
            }
        }
}, 275)
  }
}

         function stopSSL32() {
  var trade = document.getElementById("SSL32");
  if (trade.innerHTML == "Enable Upgrade All!") {
    trade.innerHTML = "Disable Upgrade All!";
  } else {
    trade.innerHTML = "Enable Upgrade All!";
  }
}

//Auto Build Script
function $(classname) {
    let element = document.getElementsByClassName(classname)
    if (element.length === 1) {
        return element[0]
    } else {
        return element
    }
}

var sSsS = function(x, y, building, yaw) {
    Game.currentGame.network.sendRpc({
        name: "MakeBuilding",
        x: x,
        y: y,
        type: building,
        yaw: yaw
    })
SellAll()
Object.keys(buildings).forEach(key => {
const building = buildings[key]
if(["Wall", "Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester" || "Wall"].indexOf(building.type) >= 0) {
delete buildings[key]
}})
}

window.GoldGeneratorr = function() {
    let waitForGoldStash = setInterval(function() {
        if (document.querySelectorAll("[data-building]")[10].classList[1] == "is-disabled") {
            let stash = GetGoldStash();
            if (stash == undefined) return
            let stashPosition = {
                x: stash.x,
                y: stash.y
            }
            clearInterval(waitForGoldStash);
            sSsS(stashPosition.x + 100000000000000000000, stashPosition.y + 100000000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 20000000000000000000000000, stashPosition.y + 200000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 100000000000000000000, stashPosition.y + 100000000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 20000000000000000000000000, stashPosition.y + 200000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 100000000000000000000, stashPosition.y + 100000000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 20000000000000000000000000, stashPosition.y + 200000000000000000000000, "ArrowTower", 0)
           sSsS(stashPosition.x + 20000000000000000000000000, stashPosition.y + 200000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 100000000000000000000, stashPosition.y + 100000000000000000000000000, "ArrowTower", 0)
            sSsS(stashPosition.x + 20000000000000000000000000, stashPosition.y + 200000000000000000000000, "ArrowTower", 0)
        }
    }, 0)
}

window.saveTowers = function() {
    var stash = GetGoldStash();
    if (stash == undefined) {
        return
    }
    var stashPosition = {
        x: stash.x,
        y: stash.y
    }
    var buildings = Game.currentGame.ui.buildings;
    for (var uid in buildings) {
        if (!buildings.hasOwnProperty(uid)) {
            continue
        }

        var obj = buildings[uid]
        var x = Game.currentGame.world.entities[obj.uid].fromTick.position.x - stashPosition.x
        var y = Game.currentGame.world.entities[obj.uid].fromTick.position.y - stashPosition.y
        var building = Game.currentGame.world.entities[obj.uid].fromTick.model
        var yaw = Game.currentGame.world.entities[obj.uid].fromTick.yaw
       for (let s of slowTraps) placeBuilding(stashPosition.x+s.x - stashPosition.x, stashPosition.y + s.y-stashPosition.y, s.type, 0);
    }
}

window.SellStash = function() {
   //   Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to sell stash?", 1e4, function() {
    var entities = Game.currentGame.world.entities;
    for (var uid in entities) {
        if (!entities.hasOwnProperty(uid)) continue;

        var obj = entities[uid];
        if (obj.fromTick.model == "GoldStash") {
            Game.currentGame.network.sendRpc({
                name: "DeleteBuilding",
                uid: obj.fromTick.uid
            })
        }
        }
Object.keys(buildings).forEach(key => {
const building = buildings[key]
if(["GoldStash" || "Wall"].indexOf(building.type) >= 0) {
delete buildings[key]
}})
// })
}

let slowTraps = []
const buildings = Game.currentGame.ui.buildings
const saveSlowTraps = () => {
slowTraps = []
Object.keys(buildings).forEach(key => {
const building = buildings[key]
if(["Wall", "Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester" || "Wall"].indexOf(building.type) >= 0) {
slowTraps.push(building)
}})},
placeBuilding = function(x, y, building, yaw) {
    Game.currentGame.network.sendRpc({
        name: "MakeBuilding",
        x: x,
        y: y,
        type: building,
        yaw: yaw
    })
}

let GoldStashh = []
const buildings2 = Game.currentGame.ui.buildings
const saveSlowTraps2 = () => {
GoldStashh = []
Object.keys(buildings2).forEach(key => {
const building = buildings2[key]
if(["GoldStash" || "Wall"].indexOf(building.type) >= 0) {
GoldStashh.push(building)
}})}

window.sellBombs = function() {
    var entities = Game.currentGame.world.entities;
    for (var uid in entities) {
        if (!entities.hasOwnProperty(uid)) continue;

        var obj = entities[uid];
        if (obj.fromTick.model == "BombTower") {
            Game.currentGame.network.sendRpc({
                name: "DeleteBuilding",
                uid: obj.fromTick.uid
            })
        }
    }
Object.keys(buildings).forEach(key => {
const building = buildings[key]
if(["BombTower" || "Wall"].indexOf(building.type) >= 0) {
delete buildings[key]
}})
}

window.SellAll = function() {
let ss4 = setInterval ( () => {
clearInterval(ss4)
     // Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to sell all?", 1e4, function() {
        var entities = Game.currentGame.world.entities;
        for(var uid in entities) {
            if(!entities.hasOwnProperty(uid)) continue;
            var obj = entities[uid];
            if(obj.fromTick.model !== "GoldStash") {
                Game.currentGame.network.sendRpc({
                    name: "DeleteBuilding",
                    uid: obj.fromTick.uid
                });
            }
        }
Object.keys(buildings).forEach(key => {
const building = buildings[key]
if(["Wall", "Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester" || "Wall"].indexOf(building.type) >= 0) {
delete buildings[key]
}})
}, 100)
// })
    }

window.UpgradeAll = function() {
let ss2 = setInterval (() => {
clearInterval(ss2)
        var entities = Game.currentGame.world.entities;
        for(var uid in entities) {
            if(!entities.hasOwnProperty(uid)) continue;
            var obj = entities[uid];
            if(obj.fromTick.model !== "GoldStash") {
                Game.currentGame.network.sendRpc({
                    name: "UpgradeBuilding",
                    uid: obj.fromTick.uid
                });
            }
        }
}, 100)
    }

    window.UpgradeStash = function() {
let ss3 = setInterval (() => {
clearInterval(ss3)
        var entities = Game.currentGame.world.entities;
        for(var uid in entities) {
            if(!entities.hasOwnProperty(uid)) continue;
            var obj = entities[uid];
            if(obj.fromTick.model == "GoldStash") {
                Game.currentGame.network.sendRpc({
                    name: "UpgradeBuilding",
                    uid: obj.fromTick.uid
                });
            }
        }
}, 100)
    }
window.saveBase = () => {
saveSlowTraps()
}
window.saveStash = () => {
saveSlowTraps2()
}

window.RecordBase = function(baseName) {
Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to record base? If you record it 2 times the first recorded base will be unrecorded.", 1e4, function() {
    var base = ""
    var stash = GetGoldStash();
    if (stash == undefined) {
        return
    }
    var stashPosition = {
        x: stash.x,
        y: stash.y
    }
    var buildings = Game.currentGame.ui.buildings;
    for (var uid in buildings) {
        if (!buildings.hasOwnProperty(uid)) {
            continue
        }

        var obj = buildings[uid]
        var x = Game.currentGame.world.entities[obj.uid].fromTick.position.x - stashPosition.x
        var y = Game.currentGame.world.entities[obj.uid].fromTick.position.y - stashPosition.y
        var building = Game.currentGame.world.entities[obj.uid].fromTick.model
        var yaw = Game.currentGame.world.entities[obj.uid].fromTick.yaw
        base += "PlaceBuilding(stashPosition.x + " + x + ", stashPosition.y + " + y + ", '" + building + "', " + yaw + ");"
    }
    localStorage.setItem(baseName, base)
})
}
GetGoldStash = function() {
    var entities = Game.currentGame.ui.buildings
    for (var uid in entities) {
        if (!entities.hasOwnProperty(uid)) {
            continue
        }
        var obj = entities[uid]
        if (obj.type == "GoldStash") {
            return obj
        }
    }
}
PlaceBuilding = function(x, y, building, yaw) {
    Game.currentGame.network.sendRpc({
        name: "MakeBuilding",
        x: x,
        y: y,
        type: building,
        yaw: yaw
    })
}
window.buildRecordedBase = function(myBaseName) {
    var waitForGoldStash = setInterval(function() {
        if (document.querySelectorAll("[data-building]")[10].classList[1] == "is-disabled") {
            stash = GetGoldStash();
            if (stash == undefined) return
            stashPosition = {
                x: stash.x,
                y: stash.y
            }
            clearInterval(waitForGoldStash)
            var basecode = localStorage.getItem(myBaseName)
            basecode = new Function(basecode)
            return basecode()
        }
    }, 275)
}
window.DeleteRecordedbase = function(mybasename) {
Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to delete recorded base?", 1e4, function() {
    if (localStorage.getItem(mybasename)) {
        localStorage.removeItem(mybasename)
    }
})
}