diff --git a/server/src/index.ts b/server/src/index.ts index 79b18a6..7812491 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -5,21 +5,40 @@ import { RageFW_ClientEventReturn, RageFW_ServerEvent, RageFW_ServerEventCallback, + RageFW_ServerEventCallbackCustom, + RageFW_ServerEventCallbackNative, } from './types.js' import { nativeEvents } from './native.events' +import type { RageFW_ICustomServerEvent } from 'rage-fw-shared-types' 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) - }) + private registerCustom( + eventName: EventName, + callback: RageFW_ServerEventCallbackCustom, + ): void { + rpc.register( + eventName, + async ( + args: Parameters, + info, + ) => { + return Array.isArray(args) + ? callback(info.player as PlayerMp, ...args) + : // @ts-ignore fixme spread tuple type no infer + callback(info.player as PlayerMp, args) + }, + ) + } + + private registerNative( + eventName: EventName, + callback: RageFW_ServerEventCallbackNative, + ): void { + mp.events.add(eventName, callback) } public register( @@ -27,11 +46,15 @@ class Server { callback: RageFW_ServerEventCallback, ): void { if (this.isNativeEvent(eventName)) { - mp.events.add(eventName, callback) + this.registerNative( + eventName, + callback as RageFW_ServerEventCallbackNative, + ) } else { - rpc.register(eventName, async (data: any[], info) => { - return callback(info.player as PlayerMp, data) - }) + this.registerCustom( + eventName, + callback as RageFW_ServerEventCallbackCustom, + ) } } @@ -41,15 +64,15 @@ class Server { Object.entries>(events).map( ([eventName, callback]) => { if (this.isNativeEvent(eventName)) { - mp.events.add(eventName, callback) + this.registerNative( + eventName, + callback as RageFW_ServerEventCallbackNative, + ) } else { - rpc.register(eventName, (args: unknown[]) => { - return Array.isArray(args) - ? (callback as (...arg: typeof args) => void)( - ...args, - ) - : (callback as (arg: typeof args) => void)(args) - }) + this.registerCustom( + eventName as keyof RageFW_ICustomServerEvent, + callback as RageFW_ServerEventCallbackCustom, + ) } }, ) @@ -71,8 +94,9 @@ export const fw = { player: new Player(), } -fw.event.register('ggfdgfd', player => {}) +fw.event.register('customServerEvent', (player, args) => true) +fw.event.register('playerDeath', (player, args, killer) => {}) fw.event.registerMany({ - trailerAttached: player => {}, + trailerAttached: (vehicle, trailer) => undefined, }) diff --git a/server/src/types.ts b/server/src/types.ts index 155eda5..f48384e 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -5,20 +5,34 @@ import type { RageFW_ICustomClientEvent, } from 'rage-fw-shared-types' +// SERVER + export type RageFW_ServerEvent = | keyof RageFW_ICustomServerEvent | keyof IServerEvents +export type RageFW_ServerEventCallbackCustom< + K extends keyof RageFW_ICustomServerEvent = keyof RageFW_ICustomServerEvent, +> = ( + player: PlayerMp, + ...args: Parameters +) => ReturnType + +type x = Parameters[number] + +export type RageFW_ServerEventCallbackNative< + K extends keyof IServerEvents = keyof IServerEvents, +> = IServerEvents[K] + export type RageFW_ServerEventCallback = K extends keyof RageFW_ICustomServerEvent - ? ( - player: PlayerMp, - ...args: Parameters - ) => ReturnType + ? RageFW_ServerEventCallbackCustom : K extends keyof IServerEvents - ? IServerEvents[K] + ? RageFW_ServerEventCallbackNative : never +// CLIENT + export type RageFW_ClientEvent = keyof RageFW_ICustomClientEvent export type RageFW_ClientEventArguments = diff --git a/shared-types/types/types/index.d.ts b/shared-types/types/types/index.d.ts index cbb18eb..24ddffc 100644 --- a/shared-types/types/types/index.d.ts +++ b/shared-types/types/types/index.d.ts @@ -1,7 +1,7 @@ declare module 'rage-fw-shared-types' { export interface RageFW_ICustomServerEvent { - customServerEvent(customArgs: string[]): boolean - customServerEvent2(customArgs2: number[]): void + customServerEvent(customArgs: string): boolean + customServerEvent2(customArgs2: number): void } export interface RageFW_ICustomClientEvent {}