您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows different userscripts to define functions that modify the game's code
- // ==UserScript==
- // @name Code Injector - Bonk.io
- // @version 1.0.4
- // @description Allows different userscripts to define functions that modify the game's code
- // @author Excigma & kklkkj
- // @namespace https://greasyfork.org/users/416480
- // @license GPL-3.0
- // @match https://bonk.io/gameframe-release.html
- // @run-at document-body
- // @grant none
- // ==/UserScript==
- // What this does:
- // - Finds other userscripts that have defined their injectors in `window.bonkCodeInjectors`, and runs them
- // Much of the code below was copied from or inspired by https://github.com/kklkkj/kklee/blob/master/src/runInjectors.js
- // Credits to https://github.com/kklkkj for creating this system where multiple
- // extensions can edit different parts of Bonk.io' code.
- // This script was originally made to inject kklkkj's kklee as a userscript
- // Go thank kklkkj for this
- (function () {
- // Original `document.head.appendChild` function that we're going to overwrite
- const _appendChild = document.head.appendChild;
- const log = (msg) => console.log(`%c[Injector] ${msg}`, "color: #06c26d");
- // When RequireJS tries to add alpha2s.js to <head> we will intercept it,
- // and patch it using functions defined by other scripts in window.bonkCodeInjectors
- document.head.appendChild = function (...args) {
- // `args?.[0]?.src.includes("alpha2s.js")` is more difficult to read
- if (args[0] && args[0]?.tagName === "SCRIPT" && args[0]?.src?.includes("alpha2s.js")) {
- // Store the url of the original unmodified alpha2s.js
- // Add ? to prevent double injection
- const code_url = args[0].src + "?";
- // Remove the src attribute so it doesn't try to load the original alpha2s.js script
- args[0].removeAttribute("src");
- (async function () {
- // Fetch alpha2s.js
- log("Fetching alpha2s.js...");
- const request = await fetch(code_url).catch(error => console.error(error));
- // Error fetching alpha2s.js (for example http 404)
- if (!request.ok) {
- log("Failed to fetch alpha2s.js");
- alert("An error occurred whilst fetching game code");
- // Fallback to what bonk.io would normally do
- args[0].src = code_url;
- return _appendChild.apply(document.head, args);
- }
- let code = await request.text();
- log("Patching alpha2s.js...");
- const start_time = performance.now();
- // No bonkCodeInjectors found, this might mean that the user does not have any bonk userscripts installed
- // or that they failed to load before this script
- // I removed the alert because people who prefer userscripts over extensions likely
- // enjoy the flexibility of being able to disable userscripts easily
- // and it's possible that they will have all their userscripts disabled at one time
- if (!window.bonkCodeInjectors) {
- // Still log to the console
- log(
- "Did not find any Bonk.io userscripts to load. This may be an error, make sure you have scripts installed."
- );
- } else {
- // Loop through `bonkCodeInjectors` and pass alpha2s.js' code in for them to modify
- let error_notified = false;
- for (const injector of window.bonkCodeInjectors) {
- try {
- // Run injector from other userscripts
- if (typeof injector === "function") code = injector(code);
- else {
- log("Injector was not a function");
- console.log(injector);
- }
- // I could check if code === injector(code); and throw an error if the code
- // did not change, but Salama also does in their userscripts which would caue
- // a double up in alert()s, which is not very nice
- } catch (error) {
- // Only notify the user once if any userscript fails to load
- // helpful to prevent spamming alerts()
- if (!error_notified) {
- // An injector from one of the other userscripts failed to load
- alert("One of your Bonk.io userscripts was unable to be loaded");
- error_notified = true;
- }
- console.error(error);
- }
- }
- }
- const end_time = performance.now();
- log(`Patched alpha2s.js successfully (${(end_time - start_time).toFixed(0)}ms)`);
- // Add the new script to the <script>'s contents
- args[0].textContent = code;
- // Make RequireJS think that the script loaded
- args[0].dispatchEvent(new Event("load"));
- // Append the modified <script> tag to document.head
- return _appendChild.apply(document.head, args);
- })().catch(error => {
- // Error patching alpha2s.js somewhere
- log("Failed to inject code into alpha2s.js");
- console.error(error);
- alert("An error occurred whilst patching game code");
- // Fallback to what bonk.io would normally do without this userscript
- args[0].src = code_url;
- return _appendChild.apply(document.head, args);
- });
- } else {
- return _appendChild.apply(document.head, args);
- }
- };
- })();