/// import rpc from 'rage-rpc' type RageFW_ServerEvent = K extends keyof RageFW_ICustomServerEvent ? K : K extends keyof IServerEvents ? K : never type RageFW_ServerEventCallback = K extends keyof RageFW_ICustomServerEvent ? ( player: PlayerMp, ...args: Parameters ) => ReturnType : K extends keyof IServerEvents ? ThisifyServerEvents[K] : never type RageFW_ClientEvent = K extends keyof RageFW_ICustomClientEvent ? K : K extends keyof IServerEvents ? K : never type RageFW_ClientEventArguments = K extends keyof RageFW_ICustomClientEvent ? Parameters : (K extends keyof IServerEvents ? ThisifyServerEvents[K] : never)[] type RageFW_ClientEventReturn = K extends keyof RageFW_ICustomClientEvent ? ReturnType : never interface RageFW_ICustomServerEvent { customEvent(arg1: number, arg2: boolean): void } interface RageFW_ICustomClientEvent { customClientEvent(arg1: number, arg2: boolean): boolean } class Server { register( eventName: RageFW_ServerEvent, callback: RageFW_ServerEventCallback, ): void public register( eventName: string, callback: (...args: unknown[]) => unknown, ) { rpc.register(eventName, callback) } // public registerMultiple(events: { // [name: string]: (player: PlayerMp, ...args: any[]) => any // }): void // // registerMultiple(events: { [name: string]: (...args: any[]) => any }) { // Object.entries(events).forEach(([name, callback]) => // rpc.register(name, (data: any[]) => { // return Array.isArray(data) ? callback(...data) : callback(data) // }), // ) // } // // register() {} } class Player { triggerClient( player: PlayerMp, eventName: RageFW_ClientEvent, ...args: RageFW_ClientEventArguments ): RageFW_ClientEventReturn public triggerClient( player: PlayerMp, eventName: string, ...args: unknown[] ) { return rpc.callClient(player, eventName, ...args) } } export const rage = { event: new Server(), player: new Player(), } rage.event.register('customEvent', (player, arg1, arg2) => { rage.player.triggerClient(player, 'customClientEvent', arg1, arg2) }) function test() {}