import rpc from 'rage-rpc' import { RageFW_ClientEvent, RageFW_ClientEventArguments, RageFW_ClientEventReturn, RageFW_ServerEvent, RageFW_ServerEventCallback, } from './types.js' import { nativeEvents } from './native.events' class Server { private isNativeEvent(eventName: string): eventName is keyof IServerEvents { return nativeEvents.includes(eventName) } public testRegister( event: string, callback: (player: PlayerMp, ...args: unknown[]) => void, ) { rpc.register(event, async (data, info) => { callback(info.player as PlayerMp, ...data) }) } public register( eventName: EventName, callback: RageFW_ServerEventCallback, ): void { if (this.isNativeEvent(eventName)) { mp.events.add(eventName, callback) } else { rpc.register(eventName, async (data: any[], info) => { return callback(info.player as PlayerMp, data) }) } } public registerMany(events: { [event in EventName]: RageFW_ServerEventCallback }): void { Object.entries(events).map(([eventName, callback]) => { if (nativeEvents.includes(eventName)) { mp.events.add( eventName as keyof IServerEvents, callback as (...arg: unknown[]) => void, ) } else { rpc.register(eventName, (args: unknown[]) => { return Array.isArray(args) ? (callback as (...arg: typeof args) => void)(...args) : (callback as (arg: typeof args) => void)(args) }) } }) } } class Player { public triggerClient( player: PlayerMp, eventName: EventName, ...args: RageFW_ClientEventArguments ): Promise> { return rpc.callClient(player, eventName, args) } } export const fw = { event: new Server(), player: new Player(), } fw.event.register('ggfdgfd', player => {}) fw.event.registerMany({ trailerAttached: player => {}, })