1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-14 18:51:51 +00:00
tobspr_shapez.io/src/js/mods/modloader.js

98 lines
2.7 KiB
JavaScript
Raw Normal View History

2022-01-14 07:55:18 +00:00
import { globalConfig } from "../core/config";
2022-01-13 20:20:42 +00:00
import { createLogger } from "../core/logging";
2022-01-14 07:55:18 +00:00
import { getIPCRenderer } from "../core/utils";
2022-01-13 20:20:42 +00:00
import { Mod } from "./mod";
import { ModInterface } from "./mod_interface";
import { MOD_SIGNALS } from "./mod_signals";
2022-01-13 20:20:42 +00:00
const LOG = createLogger("mods");
export class ModLoader {
constructor() {
LOG.log("modloader created");
/** @type {Mod[]} */
this.mods = [];
2022-01-13 21:14:49 +00:00
this.modInterface = new ModInterface(this);
/** @type {((Object) => (new (Application, ModLoader) => Mod))[]} */
2022-01-13 21:14:49 +00:00
this.modLoadQueue = [];
2022-01-13 20:20:42 +00:00
this.initialized = false;
2022-01-13 21:14:49 +00:00
this.signals = MOD_SIGNALS;
2022-01-13 20:20:42 +00:00
}
linkApp(app) {
this.app = app;
}
2022-01-14 07:55:18 +00:00
anyModsActive() {
return this.mods.length > 0;
}
async initMods() {
2022-01-13 20:20:42 +00:00
LOG.log("hook:init");
2022-01-14 07:55:18 +00:00
if (G_IS_STANDALONE) {
try {
const mods = await getIPCRenderer().invoke("get-mods");
mods.forEach(modCode => {
2022-01-14 09:14:51 +00:00
window.registerMod = mod => {
2022-01-14 07:55:18 +00:00
this.modLoadQueue.push(mod);
};
// ugh
eval(modCode);
2022-01-14 09:14:51 +00:00
delete window.registerMod;
2022-01-14 07:55:18 +00:00
});
} catch (ex) {
alert("Failed to load mods: " + ex);
}
} else if (G_IS_DEV) {
if (globalConfig.debug.loadDevMod) {
this.modLoadQueue.push(/** @type {any} */ (require("./dev_mod").default));
}
}
let exports = {};
if (G_IS_DEV || G_IS_STANDALONE) {
const modules = require.context("../", true, /\.js$/);
Array.from(modules.keys()).forEach(key => {
// @ts-ignore
const module = modules(key);
for (const member in module) {
if (member === "default") {
continue;
}
if (exports[member]) {
2022-01-14 06:53:32 +00:00
throw new Error("Duplicate export of " + member);
}
Object.defineProperty(exports, member, {
get() {
return module[member];
},
set(v) {
module[member] = v;
},
});
}
});
}
2022-01-13 20:20:42 +00:00
this.initialized = true;
2022-01-13 21:14:49 +00:00
this.modLoadQueue.forEach(modClass => {
const mod = new (modClass(exports))(this.app, this);
2022-01-13 21:14:49 +00:00
mod.init();
this.mods.push(mod);
2022-01-13 20:20:42 +00:00
});
2022-01-13 21:14:49 +00:00
this.modLoadQueue = [];
this.signals.postInit.dispatch();
2022-01-13 20:20:42 +00:00
}
}
export const MODS = new ModLoader();