build static method
Implementation
static Future<RustSetonixPlugin> build(
RustPlugin Function(PluginCallback) builder,
PluginServerInterface server, {
void Function(String)? onPrint,
ItemLocation? location,
}) async {
final callback = PluginCallback(
onPrint: onPrint ?? (s) {},
processEvent: (eventSerizalized, force) async {
try {
final event = WorldEventMapper.fromJson(eventSerizalized);
await server.process(event, force: force ?? false);
} catch (e) {
print("Error processing event from plugin: $e");
}
},
sendEvent: (eventSerizalized, target) async {
try {
final event = WorldEventMapper.fromJson(eventSerizalized);
if (event is! PlayableWorldEvent) {
throw Exception("Event is not PlayableWorldEvent");
}
await server.sendEvent(event, target: target ?? kAnyChannel);
} catch (e) {
print("Error sending event from plugin: $e");
}
},
stateFieldAccess: (field) {
final state = server.state;
return switch (field) {
StateFieldAccess.info => state.info.toJson(),
StateFieldAccess.tables => jsonEncode(
state.data.getTables().toList(),
),
StateFieldAccess.tableName => jsonEncode(state.tableName),
StateFieldAccess.players => jsonEncode(server.players),
StateFieldAccess.teamMembers => jsonEncode(state.teamMembers),
StateFieldAccess.game => jsonEncode(location?.namespace ?? 'unknown'),
StateFieldAccess.namespace => jsonEncode(
location?.namespace ?? 'unknown',
),
};
},
tableAccess: (tableName) {
if (server.state.tableName == tableName)
return server.state.table.toJson();
final table = server.state.data.getTable(tableName ?? '');
return table?.toJson() ?? "{}";
},
);
final plugin = builder(callback);
final instance = RustSetonixPlugin._(server, plugin);
instance.eventSystem.on<WorldEvent>((e) async {
final result = await instance.plugin.runEvent(
eventType: e.clientEvent.runtimeType.toString(),
event: e.clientEvent.toJson(),
serverEvent: e.serverEvent.toJson(),
target: e.target,
source: e.source,
cancelled: e.cancelled,
);
e.cancelled = result.cancelled;
e.needsUpdate = result.needsUpdate;
final serverEvent = result.serverEvent;
if (serverEvent != null) {
e.serverEvent = ServerWorldEventMapper.fromJson(serverEvent);
}
});
await instance.plugin.run();
return instance;
}