您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows adding, editing, and deleting builds dynamically and saves them using Tampermonkey's storage.
当前为
- // ==UserScript==
- // @name Diep.io build selector
- // @match *://diep.io/*
- // @version 1.4.0
- // @description Allows adding, editing, and deleting builds dynamically and saves them using Tampermonkey's storage.
- // @icon https://i.imgur.com/pvqsu5e.png
- // @license GNU GPLv3
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_addStyle
- // @grant GM_registerMenuCommand
- // @grant GM_unregisterMenuCommand
- // @run-at document-end
- // @namespace https://greasyfork.org/users/1003196
- // ==/UserScript==
- function getBuilds() {
- const savedBuilds = GM_getValue("builds", null);
- return savedBuilds ? JSON.parse(savedBuilds) : [
- { name: "Anni", values: [1, 1, 0, 7, 7, 7, 3, 7] },
- { name: "Glass", values: [0, 0, 0, 7, 7, 7, 7, 5] },
- { name: "Ram", values: [5, 7, 7, 0, 0, 0, 7, 7] },
- { name: "OverLord", values: [0, 5, 0, 7, 7, 7, 0, 7] },
- { name: "Trapper", values: [5, 7, 0, 0, 7, 7, 7, 0] },
- { name: "Necro", values: [0, 0, 0, 7, 6, 7, 6, 7] },
- { name: "Spammer", values: [2, 3, 0, 7, 7, 7, 7, 0] },
- { name: "Tri-Angle", values: [4, 4, 4, 0, 7, 7, 7, 0] },
- { name: "Assassin", values: [2, 3, 0, 7, 7, 7, 3, 4] },
- { name: "Predator", values: [0, 0, 0, 6, 7, 7, 7, 6] },
- { name: "Penta", values: [1, 3, 0, 5, 6, 6, 7, 5] }
- ];
- }
- function saveBuilds(builds) {
- GM_setValue("builds", JSON.stringify(builds));
- updateBuildMenu(); // Update build menu after saving builds
- }
- let builds = getBuilds();
- function sendCommand(command) {
- input.execute(command);
- }
- function convertBuildToString(build) {
- return build.values.map((value, index) => (index + 1).toString().repeat(value)).join('');
- }
- function optimizeBuildString(buildString) {
- const count = new Array(8).fill(0);
- buildString.split('').forEach(char => count[parseInt(char) - 1]++);
- return count.map((count, index) => (index + 1).toString().repeat(count)).join('');
- }
- function determineBuildType(values) {
- const damageStats = values[4] + values[5];
- const ramStats = values[1] + values[2];
- if (damageStats > ramStats) {
- return "damage";
- } else if (ramStats > damageStats) {
- return "ram";
- } else {
- return "balanced";
- }
- }
- function selectBuild(build) {
- const buildType = determineBuildType(build.values);
- const initialPoints = buildType === "damage" ? "65" : buildType === "ram" ? "23" : "";
- const buildString = initialPoints + optimizeBuildString(convertBuildToString(build));
- sendCommand(`game_stats_build ${buildString}`);
- closeSubmenus();
- }
- function createButton(label, icon, clickHandler) {
- const button = document.createElement("button");
- button.innerHTML = icon + " " + label;
- button.style.marginTop = "10px";
- button.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
- button.style.color = "white";
- button.style.border = "none";
- button.style.cursor = "pointer";
- button.style.padding = "5px 10px";
- button.addEventListener("click", clickHandler);
- return button;
- }
- function showManageBuildsMenu() {
- let menu = document.querySelector("#manageBuildsMenu");
- if (menu) {
- menu.parentNode.removeChild(menu);
- closeSubmenus();
- return;
- }
- menu = document.createElement("div");
- menu.id = "manageBuildsMenu";
- menu.style.cssText = "position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: rgba(0, 0, 0, 0.7); border: 1px solid grey; padding: 10px; text-align: center; z-index: 9999; color: white;";
- builds.forEach((build, index) => {
- const buildElement = document.createElement("div");
- buildElement.classList.add("menu-item");
- buildElement.style.cssText = "font-family: sans-serif; display: flex; justify-content: space-between; align-items: center;";
- const buildInfo = document.createElement("span");
- buildInfo.innerHTML = `${build.name}`;
- buildInfo.style.flex = "1";
- const editButton = createButton("", "✎", (event) => {
- event.stopPropagation();
- editBuild(index);
- });
- const deleteButton = createButton("", "⛌", (event) => {
- event.stopPropagation();
- deleteBuild(index);
- });
- buildElement.appendChild(buildInfo);
- buildElement.appendChild(editButton);
- buildElement.appendChild(deleteButton);
- menu.appendChild(buildElement);
- });
- menu.appendChild(createButton("Add New Build", "➕", addNewBuild));
- menu.appendChild(createButton("Close", "➖", () => menu.parentNode.removeChild(menu)));
- document.body.appendChild(menu);
- }
- function editBuild(index) {
- let buildName = prompt("Enter the new name of the build:", builds[index].name);
- if (!buildName) return;
- let buildValues = prompt("Enter the new build values (e.g., 0/2/3/0/7/7/7/7):", builds[index].values.join('/'));
- if (!buildValues) return;
- buildValues = buildValues.split("/").map(Number);
- if (buildValues.length !== 8) {
- alert("Invalid build values. There must be 8 values.");
- return;
- }
- builds[index] = { name: buildName, values: buildValues };
- saveBuilds(builds);
- showManageBuildsMenu();
- updateBuildMenu(); // Update build menu after editing
- }
- function deleteBuild(index) {
- if (confirm("Are you sure you want to delete the build ${builds[index].name}?")) {
- builds.splice(index, 1);
- saveBuilds(builds);
- showManageBuildsMenu();
- updateBuildMenu(); // Update build menu after deleting
- }
- }
- function addNewBuild() {
- let buildName = prompt("Enter the name of the new build:");
- if (!buildName) return;
- let buildValues = prompt("Enter the build values (e.g., 0/2/3/0/7/7/7/7):");
- if (!buildValues) return;
- buildValues = buildValues.split("/").map(Number);
- if (buildValues.length !== 8) {
- alert("Invalid build values. There must be 8 values.");
- return;
- }
- let newBuild = { name: buildName, values: buildValues };
- builds.push(newBuild);
- saveBuilds(builds);
- showManageBuildsMenu();
- updateBuildMenu(); // Update build menu after adding new build
- }
- function closeSubmenus() {
- document.querySelectorAll("#buildMenu, #manageBuildsMenu, #buildPreview").forEach(menu => menu.parentNode.removeChild(menu));
- }
- document.addEventListener("keydown", function(event) {
- if (event.key === "r") {
- showBuilds();
- let values = document.querySelector(".build-values");
- if (values) {
- values.parentNode.removeChild(values);
- }
- }
- });
- function showBuilds() {
- let menu = document.querySelector("#buildMenu");
- if (menu) {
- menu.parentNode.removeChild(menu);
- closeSubmenus();
- return;
- }
- menu = document.createElement("div");
- menu.id = "buildMenu";
- menu.style.cssText = "position: fixed; top: 50%; right: 0%; transform: translate(0, -50%); background-color: rgba(0, 0, 0, 0.7); border: 1px solid grey; padding: 10px; z-index: 9999; color: white;";
- const buildPreview = document.createElement("div");
- buildPreview.id = "buildPreview";
- buildPreview.style.cssText = "position: fixed; bottom: 10px; left: 10px; background-color: rgba(0, 0, 0, 0.5); border: 1px solid grey; padding: 10px; z-index: 10000; color: white; display: none;";
- document.body.appendChild(buildPreview);
- builds.forEach(build => {
- let buildElement = document.createElement("div");
- buildElement.classList.add("menu-item");
- buildElement.innerHTML = build.name;
- buildElement.style.cssText = "cursor: pointer; font-family: sans-serif;";
- buildElement.addEventListener("click", () => {
- selectBuild(build);
- closeSubmenus();
- });
- buildElement.addEventListener("mouseover", () => {
- buildPreview.innerHTML = build.values.join("/");
- buildPreview.style.display = "block";
- });
- buildElement.addEventListener("mouseout", () => {
- buildPreview.style.display = "none";
- });
- menu.appendChild(buildElement);
- });
- const manageBuildsButton = createButton("Manage Builds", "", showManageBuildsMenu);
- menu.appendChild(manageBuildsButton);
- document.body.appendChild(menu);
- }
- function updateBuildMenu() {
- closeSubmenus();
- showBuilds();
- }
- showBuilds();