Greasy Fork

Greasy Fork is available in English.

Base Record & Rebuild

Record Base

当前为 2022-03-28 提交的版本,查看 最新版本

// ==UserScript==
// @name         Base Record & Rebuild
// @namespace    http://tampermonkey.net/
// @version      2
// @author       Havy
// @description  Record Base
// @match        zombs.io
// @grant        none
// ==/UserScript==

let css2 = `
.button {
  background-color: #99FF33;
  font-size: 16px;
  border: none;
  color: black;
  padding: 14px 40px;
  border-radius: 8px;
  box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
  text-align: center;
}
.hud-menu-zipp4 {
top: 60%;
left: 55%;
display: none;
position: fixed;
margin: -350px 0 0 -350px;
padding: 20px 20px 20px 20px;
width: 640px;
height: 460px;
background: rgba(0, 0, 0, 0.6);
color: #eee;
z-index: 5;
}
.hud-menu-zipp4 .hud-zipp-grid4 {
margin-top: auto;
margin-left: auto;
display: block;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.2);
}
.hud-spell-icons .hud-spell-icon[data-type="Zippity4"]::before {
background-image: url("https://cdn-icons-png.flaticon.com/512/599/599063.png");
}
.hud-menu-zipp4 .hud-the-tab:hover {
background: rgba(0, 0, 0, 0.2);
color: #eee;
}
`;
let styles = document.createElement("style");
styles.appendChild(document.createTextNode(css2));
document.head.appendChild(styles);
styles.type = "text/css";

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

let modHTML = `
<div class="hud-menu-zipp4">
<div class="hud-zipp-grid4">
</div>
</div>
`;
document.body.insertAdjacentHTML("afterbegin", modHTML);
let zipz123 = document.getElementsByClassName("hud-menu-zipp4")[0];

document.getElementsByClassName("hud-zipp4-icon")[0].addEventListener("click", function () {
    if (zipz123.style.display == "none" || zipz123.style.display == "") {
        document.getElementById("hud-menu-shop")
            .style.display = "none";
        document.getElementById("hud-menu-party")
            .style.display = "none";
        document.getElementById("hud-menu-settings")
            .style.display = "none";
        zipz123.style.display = "block";
    } else {
        zipz123.style.display = "none";
    };
});

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

allIcon.forEach(function (elem) {
    elem.addEventListener("click", function () {
        if (zipz123.style.display == "block") {
            zipz123.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 (zipz123.style.display == "block") {
                zipz123.style.display = "none";
            }
        }
    }
})

document.getElementsByClassName("hud-zipp-grid4")[0].innerHTML = `
<div style="text-align:center"><br>
<button class="button" id="r1" onclick="recordBase(1);">Record Base 1</button>
<button class="button" id="b1" onclick="buildRecordedBase(1);">Build Base 1</button>
<button class="button" id="d1" onclick="deleteRecordedBase(1);">Delete Base 1</button>

<button class="button" id="r2" onclick="recordBase(2);">Record Base 2</button>
<button class="button" id="b2" onclick="buildRecordedBase(2);">Build Base 2</button>
<button class="button" id="d2" onclick="deleteRecordedBase(2);">Delete Base 2</button>

<button class="button" id="r3" onclick="recordBase(3);">Record Base 3</button>
<button class="button" id="b3" onclick="buildRecordedBase(3);">Build Base 3</button>
<button class="button" id="d3" onclick="deleteRecordedBase(3);">Delete Base 3</button>

<button class="button" id="r4" onclick="recordBase(4);">Record Base 4</button>
<button class="button" id="b4" onclick="buildRecordedBase(4);">Build Base 4</button>
<button class="button" id="d4" onclick="deleteRecordedBase(4);">Delete Base 4</button>

<button class="button" id="r5" onclick="recordBase(5);">Record Base 5</button>
<button class="button" id="b5" onclick="buildRecordedBase(5);">Build Base 5</button>
<button class="button" id="d5" onclick="deleteRecordedBase(5);">Delete Base 5</button>

<button class="button" id="r6" onclick="recordBase(6);">Record Base 6</button>
<button class="button" id="b6" onclick="buildRecordedBase(6);">Build Base 6</button>
<button class="button" id="d6" onclick="deleteRecordedBase(6);">Delete Base 6</button>

<button class="button" id="r7" onclick="recordBase(7);">Record Base 7</button>
<button class="button" id="b7" onclick="buildRecordedBase(7);">Build Base 7</button>
<button class="button" id="d7" onclick="deleteRecordedBase(7);">Delete Base 7</button>

<button class="button" id="r8" onclick="recordBase(8);">Record Base 8</button>
<button class="button" id="b8" onclick="buildRecordedBase(8);">Build Base 8</button>
<button class="button" id="d8" onclick="deleteRecordedBase(8);">Delete Base 8</button>
`;

var towerCodes = ["Wall", "Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester"];

function getGoldStash() {
    return Object.values(Game.currentGame.ui.buildings).find(building => building.type == "GoldStash");
}

window.recordBase = function (num) {
    Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to record base " + num + "? If you recorded it twice, the first recorded base will be overwrite.", 1e4, function() {
        let baseStr = "";
        for (let i in game.ui.buildings) {
            const building = game.ui.buildings[i];
            if (towerCodes.indexOf(building.type) < 0) continue;

            let yaw = 0;

            if (["Harvester", "MeleeTower"].includes(building.type)) {
                if (game.world.entities[building.uid] !== undefined) yaw = game.world.entities[building.uid].targetTick.yaw;
            }
            baseStr += `${towerCodes.indexOf(building.type)},${getGoldStash().x - building.x},${getGoldStash().y - building.y},${yaw};`;
        }
        localStorage.setItem(num, baseStr)
    })
}

window.buildRecordedBase = function (num) {
    function BuildBase(design) {
        if (getGoldStash() === undefined) {
            game.ui.getComponent('PopupOverlay').showHint("You must have a gold stash to be able to use this.");
            throw new Error("You must have a gold stash to be able to use this.");
        }
        const towers = design.split(";");

        for (let towerStr of towers) {
            const tower = towerStr.split(",");

            if (tower[0] === "") continue;
            if (tower.length < 4) {
                throw new Error(`${JSON.stringify(tower)} contains an issue that must be fixed before this design can be replicated.`);
                game.ui.getComponent('PopupOverlay').showHint("You haven't recorded base " + num);
            }
            Game.currentGame.network.sendRpc({
                name: "MakeBuilding",
                type: towerCodes[parseInt(tower[0])],
                x: getGoldStash().x - parseInt(tower[1]),
                y: getGoldStash().y - parseInt(tower[2]),
                yaw: parseInt(tower[3])
            });
        }
    }
    BuildBase(localStorage.getItem(num));
}
window.deleteRecordedBase = function(num) {
    Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to delete base " + num + "?", 1e4, function() {
        game.ui.components.PopupOverlay.showHint("Base " + num + " has been successfully deleted!");
        localStorage.setItem(num, null);
    })
}