您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Use custom weapon models client-side
// ==UserScript== // @name custom weapon models // @namespace http://tampermonkey.net/ // @version 1.0 // @description Use custom weapon models client-side // @author plxyer-x // @include https://starblast.io/# // @icon https://starblast.io/static/img/icon64.png // @license fuck is that? // @grant none // ==/UserScript== (async function () { /* shortcut (works on all systems, i think.): * Ctrl + Shift + P to open import prompt * Ctrl + Shift + Alt + P to toggle preload mode, which allows it to save the URL for preloading later if it dont work, you must not have: * ES6 or higher * Support fetch() function and if it dont work, well fuck you bitch :D */ if (document.querySelector("script#coffeescript") == null) { let coffee = document.createElement("script"); coffee.id = "coffeescript"; coffee.src = "https://cdn.jsdelivr.net/gh/jashkenas/coffeescript@master/lib/coffeescript-browser-compiler-legacy/coffeescript.js"; document.head.appendChild(coffee) } const searchProp = function (parent, conditional) { for (let key in parent) try { if (conditional(parent[key], key)) return { value: parent[key], key: key }; } catch (e) { } return { value: null, key: null } } let a = []; Collectible.toString().replace(/this\.(\w+)\s*\=\s*\w,/g, (v, e) => a.push(e)); a.shift(); this.CustomWeaponModels = { console: { color: "#00FFFF", name: "CustomWeaponModelsLoader", handle: function (action, ...logs) { return console[action](`%c[${this.name}] ` + logs[0], `color: ${this.color}`, ...logs.slice(1)) }, log: function (...logs) { return this.handle("log", ...logs) }, error: function (...logs) { return this.handle("error", ...logs) }, warn: function (...logs) { return this.handle("warn", ...logs) } }, list: WeaponModel, import: async function (URL) { if (URL == null) return this.reset(); this.console.log("Importing weapon models..."); try { let data = JSON.parse(await (await window.fetch(URL)).text()); for (let i of data.data) this.set(i.data, i.type, true); this.update(); this.console.log("Imported weapon models from the pack '" + (data.name || "Unknown") + "' by " + (data.author || "Anonymous") + "."); return true } catch (e) { this.console.error("Failed to import the weapon models. Caught error:", e); this.reset(); return false } }, local: { prefix: "CustomWeaponModels_", data: function (name, val) { switch (arguments.length) { case 0: return null; case 1: return localStorage.getItem(this.prefix + name); default: if (val == null) return localStorage.removeItem(this.prefix + name), null; localStorage.setItem(this.prefix + name, val); return this.data(name); } } }, reset: async function () { return await this.import("https://raw.githubusercontent.com/Bhpsngum/starblast-snippets/master/CustomWeaponModels/Robonuko_RTX/manifest.json") }, set: function (coffeescript, type, ignoreUpdate) { this.list[String(type).toUpperCase().trim().replace(/\s/g, "_") + "_MODEL"] = Function("return " + CoffeeScript.compile(coffeescript))(); if (!ignoreUpdate) this.update() }, update: function () { // reset collectible shapes window.Collectible.models = {}; this.list.images_buffer = []; this.list.icons_buffer = []; let main = searchProp(window.module.exports.settings, (v, k) => v.mode).value; let manager = searchProp(main, (v, k) => v.collectibles != null).value; let collectibles = manager.collectibles; collectibles.collectibles.forEach(function (v) { let props = a.map(i => v[i]); collectibles.remove(v); collectibles.add.apply(collectibles, props); }); // reset projectiles let proj = searchProp(manager, (v, k) => Array.isArray(v.projectiles)).value; proj.projectiles.forEach(e => e.dispose()); proj.projectiles = []; // reset pods let pods = searchProp(manager, (v, k) => v.pods).value.pods; pods.models = {}; let names = ["mining", "attack", "defence"]; for (let i = 0; i < names.length; ++i) { let subpods = pods[names[i] + "_pods"]; while (subpods.length > 0) pods.remove(i, 0); } }, initialize: function () { let wait = setInterval(function () { try { CoffeeScript } catch (e) { return } clearInterval(wait); let loadURL = this.local.data("importURL"); if (this.local.data("keepURL") == '1' && loadURL != null) this.import(loadURL); else this.reset(); window.addEventListener('keydown', function (e) { if (e.ctrlKey && e.shiftKey) switch (e.keyCode) { case 80: /* P */ { if (e.altKey) { let enableSave = !(this.local.data('keepURL') == '1'), status = enableSave ? "ENABLED" : "DISABLED"; this.local.data('keepURL', +enableSave); alert(`Preload mode for Custom Station Module Modules Loader is ${status}`); this.console.log(`Preload mode is ${status}`); break; } let res = prompt("Paste manifest file (JSON format) URL here to import weapon models (leave blank to reset):"); if (res != null) { res = res == '' ? null : res; if (confirm("Do you want to save this URL for preloading later?")) this.local.data("importURL", res); this.import(res).then(success => { alert(success ? "Weapon models successfully loaded." : "Failed to import weapon models. Check DevTools console for more details.") }) } break } } }.bind(this)); }.bind(this), 500); } } this.CustomWeaponModels.initialize(); }).call(window);