diff --git a/package/client/resource/callback/index.ts b/package/client/resource/callback/index.ts new file mode 100644 index 0000000..033b8b1 --- /dev/null +++ b/package/client/resource/callback/index.ts @@ -0,0 +1,53 @@ +import { cache } from '../cache'; + +const activeEvents: Record = {}; + +onNet(`__ox_cb_${cache.resource}`, (key: string, ...args: any) => { + const resolve = activeEvents[key]; + return resolve && resolve(...args); +}); + +const eventTimers: Record = {}; + +export function eventTimer(eventName: string, delay: number | null) { + if (delay && delay > 0) { + const currentTime = GetGameTimer(); + + if ((eventTimers[eventName] || 0) > currentTime) return false; + + eventTimers[eventName] = currentTime + delay; + } + + return true; +} + +export function triggerServerCallback(eventName: string, delay: number | null, ...args: any) { + if (!eventTimer(eventName, delay)) return; + + let key: string; + + do { + key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}`; + } while (activeEvents[key]); + + emitNet(`__ox_cb_${eventName}`, cache.resource, key, ...args); + + return new Promise((resolve) => { + activeEvents[key] = resolve; + }); +} + +export function onServerCallback(eventName: string, cb: (...args: any) => any) { + onNet(`__ox_cb_${eventName}`, (resource: string, key: string, ...args: any) => { + let response: any; + + try { + response = cb(...args); + } catch (e: any) { + console.error(`an error occurred while handling callback event ${eventName}`); + console.log(`^3${e.stack}^0`); + } + + emitNet(`__ox_cb_${resource}`, key, response); + }); +} diff --git a/package/client/resource/index.ts b/package/client/resource/index.ts index 307b137..ae0f429 100644 --- a/package/client/resource/index.ts +++ b/package/client/resource/index.ts @@ -9,5 +9,5 @@ export * from './interface/textui'; export * from './interface/skillcheck'; export * from './streaming'; - export * from './vehicleProperties'; +export * from './callback'; diff --git a/package/server/resource/callback/index.ts b/package/server/resource/callback/index.ts new file mode 100644 index 0000000..6b99036 --- /dev/null +++ b/package/server/resource/callback/index.ts @@ -0,0 +1,38 @@ +import { cache } from '../cache'; + +const activeEvents: Record = {}; + +onNet(`__ox_cb_${cache.resource}`, (key: string, ...args: any) => { + const resolve = activeEvents[key]; + return resolve && resolve(...args); +}); + +export function triggerClientCallback(eventName: string, playerId: number, ...args: any) { + let key: string; + + do { + key = `${eventName}:${Math.floor(Math.random() * (100000 + 1))}:${playerId}`; + } while (activeEvents[key]); + + emitNet(`__ox_cb_${eventName}`, playerId, cache.resource, key, ...args); + + return new Promise((resolve) => { + activeEvents[key] = resolve; + }); +} + +export function onClientCallback(eventName: string, cb: (playerId: number, ...args: any) => any) { + onNet(`__ox_cb_${eventName}`, (resource: string, key: string, ...args: any) => { + const src = source; + let response: any; + + try { + response = cb(src, ...args); + } catch (e: any) { + console.error(`an error occurred while handling callback event ${eventName}`); + console.log(`^3${e.stack}^0`); + } + + emitNet(`__ox_cb_${resource}`, src, key, response); + }); +} diff --git a/package/server/resource/index.ts b/package/server/resource/index.ts index 5e18712..fbce843 100644 --- a/package/server/resource/index.ts +++ b/package/server/resource/index.ts @@ -1,2 +1,4 @@ export * from './acl'; export * from './locale'; +export * from './callback'; +export * from './version';