1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2025-12-16 11:41:50 +00:00
tobspr_shapez.io/src/js/mods/modloader.js

78 lines
1.9 KiB
JavaScript
Raw Normal View History

2022-01-13 20:20:42 +00:00
import { Loader } from "../core/loader";
import { createLogger } from "../core/logging";
import { AtlasSprite } from "../core/sprites";
import { DemoMod } from "./demo_mod";
import { Mod } from "./mod";
import { ModInterface } from "./mod_interface";
const LOG = createLogger("mods");
export class ModLoader {
constructor() {
LOG.log("modloader created");
/** @type {Mod[]} */
this.mods = [];
/** @type {Map<string, AtlasSprite>} */
this.lazySprites = new Map();
this.initialized = false;
}
linkApp(app) {
this.app = app;
this.mods.forEach(mod => (mod.interface.app = app));
}
hook_init() {
LOG.log("hook:init");
this.initialized = true;
this.mods.forEach(mod => {
LOG.log("Loading mod", mod.metadata.name);
mod.interface = new ModInterface(this, mod);
mod.executeGuarded("hook_init", mod.hook_init.bind(mod));
});
}
hook_injectSprites() {
LOG.log("hook:injectSprites");
this.lazySprites.forEach((sprite, key) => {
Loader.sprites.set(key, sprite);
console.log("override", key);
});
}
callHook(id, structuredArgs) {
LOG.log("hook:" + id);
this.mods.forEach(mod => {
const handler = mod["hook_" + id];
if (handler) {
mod.executeGuarded("hook:" + id, handler.bind(mod, structuredArgs));
}
});
}
registerSprite() {}
registerGameState() {}
registerBuilding() {}
/**
*
* @param {Mod} mod
*/
registerMod(mod) {
LOG.log("Registering mod", mod.metadata.name);
if (this.initialized) {
throw new Error("Mods are already initialized, can not add mod afterwards.");
}
this.mods.push(mod);
}
}
export const MODS = new ModLoader();
MODS.registerMod(new DemoMod());