Infinite Craft Tools

Tools for infinite craft

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Infinite Craft Tools
// @author       JoshAtticus
// @version      1.1
// @description  Tools for infinite craft
// @match        https://neal.fun/infinite-craft/
// @grant        GM_xmlhttpRequest
// @license      MIT
// @namespace https://greasyfork.org/users/1253827
// ==/UserScript==

(function() {
  'use strict';

  // Function to upload data to Pastebin
  function uploadDataToPastebin(data) {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: "POST",
        url: "https://pastebin.com/api/api_post.php",
        data: "api_option=paste&api_dev_key=YiMYzQBSRWQmmFue-ZdTsV2wcMTBKm-H&api_paste_code=" + encodeURIComponent(data),
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        },
        onload: function(response) {
          if (response.status === 200 && response.responseText.startsWith("https://pastebin.com/")) {
            resolve(response.responseText);
          } else {
            reject(new Error("Failed to upload data to Pastebin."));
          }
        },
        onerror: function() {
          reject(new Error("Failed to upload data to Pastebin."));
        }
      });
    });
  }

  // Function to retrieve data from Pastebin
  function retrieveDataFromPastebin(url) {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: "GET",
        url: url,
        onload: function(response) {
          if (response.status === 200) {
            resolve(response.responseText);
          } else {
            reject(new Error("Failed to retrieve data from Pastebin."));
          }
        },
        onerror: function() {
          reject(new Error("Failed to retrieve data from Pastebin."));
        }
      });
    });
  }

  // Function to clear localStorage and restore from URL
  function clearLocalStorageAndRestoreFromURL(url) {
    if (confirm("This will delete any existing data. Do you want to continue?")) {
      retrieveDataFromPastebin(url)
        .then(data => {
          localStorage.clear();
          const parsedData = JSON.parse(data);
          const infiniteCraftData = parsedData["infinite-craft-data"];
          localStorage.setItem("infinite-craft-data", infiniteCraftData);
          location.reload();
        })
        .catch(error => {
          alert("Failed to retrieve data from the provided URL.");
        });
    }
  }

  // Function to add a new item to the data
  function addItem(name, emoji) {
    const data = JSON.parse(localStorage.getItem("infinite-craft-data"));
    if (data && data.elements) {
      const newItem = {
        text: name,
        emoji: emoji,
        discovered: false
      };
      data.elements.push(newItem);
      localStorage.setItem("infinite-craft-data", JSON.stringify(data));
      alert(`Item '${name}' with emoji '${emoji}' added successfully.`);
      location.reload();
    }
  }

  // Function to delete an item from the data
  function deleteItem(name, emoji, discovered) {
    const data = JSON.parse(localStorage.getItem("infinite-craft-data"));
    if (data && data.elements) {
      const index = data.elements.findIndex(item => item.text === name && item.emoji === emoji);
      if (index !== -1) {
        const item = data.elements[index];
        const message = discovered
          ? `WARNING: THIS IS A FIRST DISCOVERY! IF YOU DELETE IT, YOU WON'T BE ABLE TO GET IT BACK!\n\nAre you sure you want to delete ${name} with emoji ${emoji}?`
          : `Are you sure you want to delete ${name} with emoji ${emoji}?`;
        if (confirm(message)) {
          data.elements.splice(index, 1);
          localStorage.setItem("infinite-craft-data", JSON.stringify(data));
          alert(`Item '${name}' with emoji '${emoji}' deleted successfully.`);
          location.reload();
        }
      } else {
        alert("Item not found.");
      }
    }
  }

  // Function to update item count
  function updateItemCount() {
    const data = JSON.parse(localStorage.getItem("infinite-craft-data"));
    const itemCountElement = document.getElementById("item-count");
    if (itemCountElement) {
      itemCountElement.textContent = `Items: ${data.elements.length}, First Discoveries: ${data.elements.filter(item => item.discovered).length}`;
    }
  }

  // Keydown event listener
  document.addEventListener("keydown", function(event) {
    if ((event.ctrlKey || event.metaKey) && event.key === "s") {
      event.preventDefault();
      const data = JSON.stringify(localStorage);
      uploadDataToPastebin(data)
        .then(url => {
          const rawURL = url.replace("pastebin.com", "pastebin.com/raw");
          const message = "Data uploaded to Pastebin successfully!\n\nCopy the URL below:\n\n" + rawURL +
            "\n\nUse Ctrl/Cmd + L on another device/browser and paste the URL to load the data.";
          alert(message);
        })
        .catch(error => {
          alert("Failed to upload data to Pastebin.");
        });
    } else if ((event.ctrlKey || event.metaKey) && event.key === "l") {
      event.preventDefault();
      const url = prompt("Enter the URL of the data to restore:");
      if (url) {
        clearLocalStorageAndRestoreFromURL(url);
      }
    } else if ((event.ctrlKey || event.metaKey) && event.key === "n") {
      event.preventDefault();
      const name = prompt("Enter the name of the item:");
      const emoji = prompt("Enter the emoji for the item:");
      if (name && emoji) {
        addItem(name, emoji);
      }
    } else if ((event.ctrlKey || event.metaKey) && event.key === "d") {
      event.preventDefault();
      const name = prompt("Enter the name of the item to delete:");
      if (name) {
        const data = JSON.parse(localStorage.getItem("infinite-craft-data"));
        if (data && data.elements) {
          const item = data.elements.find(item => item.text === name);
          if (item) {
            const message = item.discovered
              ? `WARNING: THIS IS A FIRST DISCOVERY! IF YOU DELETE IT, YOU WON'T BE ABLE TO GET IT BACK!\n\nAre you sure you want to delete ${item.text} with emoji ${item.emoji}?`
              : `Are you sure you want to delete ${item.text} with emoji ${item.emoji}?`;
            if (confirm(message)) {
              deleteItem(item.text, item.emoji, item.discovered);
            }
          } else {
            alert("Item not found.");
          }
        }
      }
    }
  });

  // Display initial count of items and first discoveries
  const itemCountElement = document.createElement("div");
  itemCountElement.id = "item-count";
  itemCountElement.style.position = "fixed";
  itemCountElement.style.bottom = "20px";
  itemCountElement.style.left = "0";
  itemCountElement.style.right = "0";
  itemCountElement.style.textAlign = "center";
  itemCountElement.style.fontSize = "18px";
  itemCountElement.style.fontWeight = "bold";
  itemCountElement.style.color = "#333";
  document.body.appendChild(itemCountElement);
  updateItemCount();

  // Update item count every 1 second
  setInterval(updateItemCount, 1000);
})();