您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Record Base
- // ==UserScript==
- // @name Base Record & Rebuild
- // @namespace http://tampermonkey.net/
- // @version 2.2
- // @author Havy
- // @description Record Base
- // @match zombs.io
- // @icon https://cdn-icons-png.flaticon.com/512/599/599063.png
- // @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: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- display: none;
- position: fixed;
- padding: 20px;
- width: 640px;
- height: 460px;
- background: rgba(0, 0, 0, 0.6);
- color: #eee;
- z-index: 5;
- }
- .hud-menu-zipp4 .hud-zipp-grid4 {
- margin: 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.querySelector('#hud').insertAdjacentHTML("afterbegin", modHTML);
- let zipz123 = document.getElementsByClassName("hud-menu-zipp4")[0];
- document.getElementsByClassName("hud-zipp4-icon")[0].addEventListener("click", () => {
- if(["none", ""].includes(zipz123.style.display)) {
- zipz123.style.display = "block";
- for(let i of Array.from(document.getElementsByClassName("hud-menu"))) {
- i.style.display = "none";
- };
- } else {
- zipz123.style.display = "none";
- };
- });
- for (let i of Array.from(document.getElementsByClassName("hud-menu-icon"))) {
- i.addEventListener('click', function() {
- if (document.getElementsByClassName("hud-menu-zipp4")[0].style.display == "block") {
- document.getElementsByClassName("hud-menu-zipp4")[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.dataset.type !== "Zippity4") {
- i.addEventListener('click', function() {
- if (document.getElementsByClassName("hud-menu-zipp4")[0].style.display == "block") {
- document.getElementsByClassName("hud-menu-zipp4")[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 (zipz123.style.display == "block") {
- zipz123.style.display = "none";
- }
- }
- }
- })
- document.getElementsByClassName("hud-zipp-grid4")[0].innerHTML = `
- <div style="text-align:center"><br>
- <button class="button" onclick="recordBase(1);">Record Base 1</button>
- <button class="button" onclick="buildRecordedBase(1);">Build Base 1</button>
- <button class="button" onclick="deleteRecordedBase(1);">Delete Base 1</button>
- <button class="button" onclick="recordBase(2);">Record Base 2</button>
- <button class="button" onclick="buildRecordedBase(2);">Build Base 2</button>
- <button class="button" onclick="deleteRecordedBase(2);">Delete Base 2</button>
- <button class="button" onclick="recordBase(3);">Record Base 3</button>
- <button class="button" onclick="buildRecordedBase(3);">Build Base 3</button>
- <button class="button" onclick="deleteRecordedBase(3);">Delete Base 3</button>
- <button class="button" onclick="recordBase(4);">Record Base 4</button>
- <button class="button" onclick="buildRecordedBase(4);">Build Base 4</button>
- <button class="button" onclick="deleteRecordedBase(4);">Delete Base 4</button>
- <button class="button" onclick="recordBase(5);">Record Base 5</button>
- <button class="button" onclick="buildRecordedBase(5);">Build Base 5</button>
- <button class="button" onclick="deleteRecordedBase(5);">Delete Base 5</button>
- <button class="button" onclick="recordBase(6);">Record Base 6</button>
- <button class="button" onclick="buildRecordedBase(6);">Build Base 6</button>
- <button class="button" onclick="deleteRecordedBase(6);">Delete Base 6</button>
- <button class="button" onclick="recordBase(7);">Record Base 7</button>
- <button class="button" onclick="buildRecordedBase(7);">Build Base 7</button>
- <button class="button" onclick="deleteRecordedBase(7);">Delete Base 7</button>
- <button class="button" onclick="recordBase(8);">Record Base 8</button>
- <button class="button" onclick="buildRecordedBase(8);">Build Base 8</button>
- <button class="button" 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);
- })
- }