mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Replace invokeHook and the per plugin on* methods with AsyncHook collections on the controller, host, instance, clusterioctl and web control objects. Plugin entrypoints export a default function that receives a load context and attaches handlers to the hooks it needs. Class exports still load through fromContext with a deprecation warning. The create templates and docs use the entrypoint function. This is clusterio/clusterio#921 recreated on top of master after the ESM migration and the PluginDeclaration permissions change. Closes #730 Co-Authored-By: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
import * as lib from "@clusterio/lib";
|
|
//%if multi_context
|
|
import { PluginExampleEvent, PluginExampleRequest } from "./messages.js";
|
|
//%endif
|
|
|
|
export default async function loadInstancePlugin(context) {
|
|
const { instance, logger, plugin } = context;
|
|
//%if multi_context
|
|
|
|
instance.handle(PluginExampleEvent, async (event) => {
|
|
logger.info(JSON.stringify(event));
|
|
});
|
|
|
|
instance.handle(PluginExampleRequest, async (request) => {
|
|
logger.info(JSON.stringify(request));
|
|
return {
|
|
myResponseString: request.myString,
|
|
myResponseNumbers: request.myNumberArray,
|
|
};
|
|
});
|
|
//%endif
|
|
//%if module
|
|
|
|
instance.server.handle("__plugin_name__-plugin_example_ipc", async (event) => {
|
|
logger.info(JSON.stringify(event));
|
|
});
|
|
//%endif
|
|
|
|
instance.hooks.instanceConfigFieldChanged.attach(plugin.name, async (field, curr, prev) => {
|
|
logger.info(`instance::instanceConfigFieldChanged ${field}`);
|
|
});
|
|
|
|
instance.hooks.start.attach(plugin.name, async () => {
|
|
// Called once rcon becomes available
|
|
logger.info("instance::start");
|
|
});
|
|
|
|
instance.hooks.stop.attach(plugin.name, async () => {
|
|
// Called during normal exits before rcon becomes unavailable
|
|
logger.info("instance::stop");
|
|
});
|
|
|
|
instance.hooks.exit.attach(plugin.name, () => {
|
|
// Called during all exits, including crashes and init failures, rcon is not available
|
|
logger.info("instance::exit");
|
|
});
|
|
|
|
instance.hooks.playerEvent.attach(plugin.name, async (event) => {
|
|
logger.info(`instance::playerEvent ${JSON.stringify(event)}`);
|
|
//%if module
|
|
if (instance.status === "running") {
|
|
await instance.sendRcon("/sc __plugin_name__.foo()", false, plugin.name);
|
|
}
|
|
//%endif
|
|
});
|
|
}
|