import EventEmitter from 'eventemitter3'; import { AdaptorPackageData } from '../../adaptor.js'; interface GamePlayerEntityLike { player: { userKey: string; }; } interface RemoteChannel { onServerEvent(fn: (e: { args: unknown; entity: T; }) => void): void; } /** * 这是 [dao3 游戏](https://dao3.fun/) 代码服务端适配器。 * ```ts * const remoteManager = new ServerSideRemoteChannelEventManager(remoteChannel) * * world.onPlayerLeave( * remoteManager.onPlayerLeave.bind(remoteManager) * ) * * export const remoteAdaptor = { * every: remoteManager.onEvery.bind(remoteManager), * off: remoteManager.off.bind(remoteManager), * on: remoteManager.on.bind(remoteManager), * once: remoteManager.once.bind(remoteManager), * emit: (e) => { * const entity = remoteManager.getEntity(e.targetDeviceId) * if (!entity) { * console.error('entity not found') * return * } * remoteChannel.sendClientEvent(entity, e as unknown as JSONValue) * }, * } satisfies Adaptor * * export const remote = new Remote( * remoteAdaptor, * { * deviceId: 'server', * } * ) * * remote.register('initConnection', async () => { * // 什么也不干,单纯的让客户端在服务端“备案” * }) * * export const getEntity = remoteManager.getEntity.bind(remoteManager) * export const getIdByEntity = remoteManager.getIdByEntity.bind(remoteManager) * export const waitForRegister = remoteManager.waitForRegister.bind(remoteManager) * export const remoteTo = remoteManager.remoteTo.bind(remoteManager) * ``` */ declare class ServerSideRemoteChannelEventManager extends EventEmitter<{ [key: string]: [AdaptorPackageData]; }> { entityMap: [string, T][]; constructor(remoteChannel: RemoteChannel); onPlayerLeave(e: { entity: T; }): void; onEvery(fn: (args: AdaptorPackageData) => void): void; waitForRegister(entity: T): Promise; getEntity(deviceId: string): T | undefined; getIdByEntity(entity: T): string | undefined; remoteTo(config: { target: T; }): { targetDeviceId: string; }; remoteTo(config: { target: T; timeoutMs: number; }): { targetDeviceId: string; timeoutMs: number; }; } export { ServerSideRemoteChannelEventManager };