Example Plugins
Network Sync Plugin
Section titled “Network Sync Plugin”import { IPlugin, IService, Core, ServiceContainer } from '@esengine/ecs-framework';
class NetworkSyncService implements IService { private ws?: WebSocket;
connect(url: string) { this.ws = new WebSocket(url); this.ws.onmessage = (event) => { const data = JSON.parse(event.data); this.handleMessage(data); }; }
private handleMessage(data: any) { // Handle network messages }
dispose(): void { if (this.ws) { this.ws.close(); this.ws = undefined; } }}
class NetworkSyncPlugin implements IPlugin { readonly name = 'network-sync'; readonly version = '1.0.0';
install(core: Core, services: ServiceContainer): void { // Register network service services.registerSingleton(NetworkSyncService);
// Auto connect const network = services.resolve(NetworkSyncService); network.connect('ws://localhost:8080'); }
uninstall(): void { // Service will auto-dispose }}Performance Analysis Plugin
Section titled “Performance Analysis Plugin”class PerformanceAnalysisPlugin implements IPlugin { readonly name = 'performance-analysis'; readonly version = '1.0.0'; private frameCount = 0; private totalTime = 0;
install(core: Core, services: ServiceContainer): void { const monitor = services.resolve(PerformanceMonitor); monitor.enable();
// Periodic performance report const timer = services.resolve(TimerManager); timer.schedule(5.0, true, null, () => { this.printReport(monitor); }); }
uninstall(): void { // Cleanup }
private printReport(monitor: PerformanceMonitor) { console.log('=== Performance Report ==='); console.log(`FPS: ${monitor.getFPS()}`); console.log(`Memory: ${monitor.getMemoryUsage()} MB`); }}Debug Tools Plugin
Section titled “Debug Tools Plugin”class DebugToolsPlugin implements IPlugin { readonly name = 'debug-tools'; readonly version = '1.0.0'; private debugUI?: DebugUI;
install(core: Core, services: ServiceContainer): void { // Create debug UI this.debugUI = new DebugUI(); this.debugUI.mount(document.body);
// Register hotkey window.addEventListener('keydown', this.handleKeyDown);
// Add debug system const scene = core.scene; if (scene) { scene.addSystem(new DebugRenderSystem()); } }
uninstall(): void { // Remove UI if (this.debugUI) { this.debugUI.unmount(); this.debugUI = undefined; }
// Remove event listener window.removeEventListener('keydown', this.handleKeyDown); }
private handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'F12') { this.debugUI?.toggle(); } };}Audio Plugin
Section titled “Audio Plugin”class AudioPlugin implements IPlugin { readonly name = 'audio'; readonly version = '1.0.0';
constructor(private config: { volume: number }) {}
install(core: Core, services: ServiceContainer): void { const audioService = new AudioService(this.config); services.registerInstance(AudioService, audioService);
// Add audio system const scene = core.scene; if (scene) { scene.addSystem(new AudioSystem()); } }
uninstall(): void { // Stop all audio const audio = Core.services.resolve(AudioService); audio.stopAll(); }}
// Usageawait Core.installPlugin(new AudioPlugin({ volume: 0.8 }));Input Manager Plugin
Section titled “Input Manager Plugin”class InputPlugin implements IPlugin { readonly name = 'input'; readonly version = '1.0.0'; private inputManager?: InputManager;
install(core: Core, services: ServiceContainer): void { this.inputManager = new InputManager(); services.registerInstance(InputManager, this.inputManager);
// Bind default keys this.inputManager.bind('jump', ['Space', 'KeyW']); this.inputManager.bind('attack', ['MouseLeft', 'KeyJ']);
// Add input system const scene = core.scene; if (scene) { scene.addSystem(new InputSystem()); } }
uninstall(): void { if (this.inputManager) { this.inputManager.dispose(); this.inputManager = undefined; } }}