Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/adapters/cfx/cfx-platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { IPlayerInfo } from '../contracts/IPlayerInfo'
import { IResourceInfo } from '../contracts/IResourceInfo'
import { ITick } from '../contracts/ITick'
import { IEntityServer } from '../contracts/server/IEntityServer'
import { IPedServer } from '../contracts/server/IPedServer'
import { IPedAppearanceServer } from '../contracts/server/IPedAppearanceServer'
import { IPlayerServer } from '../contracts/server/IPlayerServer'
import { IVehicleServer } from '../contracts/server/IVehicleServer'
Expand Down Expand Up @@ -34,6 +35,7 @@ export const CfxPlatform: PlatformAdapter = {
{ FiveMTick },
{ FiveMPlayerInfo },
{ FiveMEntityServer },
{ FiveMPedServer },
{ FiveMVehicleServer },
{ FiveMPlayerServer },
{ FiveMHasher },
Expand All @@ -48,6 +50,7 @@ export const CfxPlatform: PlatformAdapter = {
import('../fivem/fivem-tick'),
import('../fivem/fivem-playerinfo'),
import('../fivem/fivem-entity-server'),
import('../fivem/fivem-ped-server'),
import('../fivem/fivem-vehicle-server'),
import('../fivem/fivem-player-server'),
import('../fivem/fivem-hasher'),
Expand Down Expand Up @@ -85,6 +88,9 @@ export const CfxPlatform: PlatformAdapter = {
if (!container.isRegistered(IEntityServer as any)) {
container.registerSingleton(IEntityServer as any, FiveMEntityServer)
}
if (!container.isRegistered(IPedServer as any)) {
container.registerSingleton(IPedServer as any, FiveMPedServer)
}
if (!container.isRegistered(IVehicleServer as any)) {
container.registerSingleton(IVehicleServer as any, FiveMVehicleServer)
}
Expand Down
41 changes: 41 additions & 0 deletions src/adapters/contracts/server/IPedServer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/**
* Server-side ped operations adapter.
*
* @remarks
* Provides a platform-agnostic contract to spawn and manage NPC peds.
*/
export abstract class IPedServer {
/**
* Creates a server-side ped.
*
* @param pedType - Platform ped type.
* @param modelHash - Ped model hash.
* @param x - X world position.
* @param y - Y world position.
* @param z - Z world position.
* @param heading - Heading in degrees.
* @param networked - Whether the ped should be networked.
* @returns Entity handle or 0 on failure.
*/
abstract create(
pedType: number,
modelHash: number,
x: number,
y: number,
z: number,
heading: number,
networked: boolean,
): number

/** Deletes a ped entity. */
abstract delete(handle: number): void

/** Returns the network id for an entity handle. */
abstract getNetworkIdFromEntity(handle: number): number

/** Returns the entity handle for a network id. */
abstract getEntityFromNetworkId(networkId: number): number

/** Checks whether a network id is currently valid. */
abstract networkIdExists(networkId: number): boolean
}
34 changes: 34 additions & 0 deletions src/adapters/fivem/fivem-ped-server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { injectable } from 'tsyringe'
import { IPedServer } from '../contracts/server/IPedServer'

/** FiveM implementation of server-side ped operations. */
@injectable()
export class FiveMPedServer extends IPedServer {
create(
pedType: number,
modelHash: number,
x: number,
y: number,
z: number,
heading: number,
networked: boolean,
): number {
return CreatePed(pedType, modelHash, x, y, z, heading, networked, true)
}

delete(handle: number): void {
DeleteEntity(handle)
}

getNetworkIdFromEntity(handle: number): number {
return NetworkGetNetworkIdFromEntity(handle)
}

getEntityFromNetworkId(networkId: number): number {
return NetworkGetEntityFromNetworkId(networkId)
}

networkIdExists(networkId: number): boolean {
return NetworkDoesEntityExistWithNetworkId(networkId)
}
}
5 changes: 5 additions & 0 deletions src/adapters/fivem/fivem-platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { IPlayerInfo } from '../contracts/IPlayerInfo'
import { IResourceInfo } from '../contracts/IResourceInfo'
import { ITick } from '../contracts/ITick'
import { IEntityServer } from '../contracts/server/IEntityServer'
import { IPedServer } from '../contracts/server/IPedServer'
import { IPedAppearanceServer } from '../contracts/server/IPedAppearanceServer'
import { IPlayerServer } from '../contracts/server/IPlayerServer'
import { IVehicleServer } from '../contracts/server/IVehicleServer'
Expand Down Expand Up @@ -36,6 +37,7 @@ export const FiveMPlatform: PlatformAdapter = {
{ FiveMTick },
{ FiveMPlayerInfo },
{ FiveMEntityServer },
{ FiveMPedServer },
{ FiveMVehicleServer },
{ FiveMPlayerServer },
{ FiveMHasher },
Expand All @@ -49,6 +51,7 @@ export const FiveMPlatform: PlatformAdapter = {
import('./fivem-tick'),
import('./fivem-playerinfo'),
import('./fivem-entity-server'),
import('./fivem-ped-server'),
import('./fivem-vehicle-server'),
import('./fivem-player-server'),
import('./fivem-hasher'),
Expand Down Expand Up @@ -77,6 +80,8 @@ export const FiveMPlatform: PlatformAdapter = {
container.registerSingleton(IPlayerInfo as any, FiveMPlayerInfo)
if (!container.isRegistered(IEntityServer as any))
container.registerSingleton(IEntityServer as any, FiveMEntityServer)
if (!container.isRegistered(IPedServer as any))
container.registerSingleton(IPedServer as any, FiveMPedServer)
if (!container.isRegistered(IVehicleServer as any))
container.registerSingleton(IVehicleServer as any, FiveMVehicleServer)
if (!container.isRegistered(IPlayerServer as any))
Expand Down
1 change: 1 addition & 0 deletions src/adapters/fivem/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export { FiveMEngineEvents } from './fivem-engine-events'
export { FiveMEntityServer } from './fivem-entity-server'
export { FiveMExports } from './fivem-exports'
export { FiveMHasher } from './fivem-hasher'
export { FiveMPedServer } from './fivem-ped-server'
export { FiveMMessagingTransport } from './transport/adapter'
export { FiveMPedAppearanceServerAdapter } from './fivem-ped-appearance-server'
// Platform adapter
Expand Down
1 change: 1 addition & 0 deletions src/adapters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export * from './contracts/transport/rpc.api'

// Server contracts
export * from './contracts/server/IEntityServer'
export * from './contracts/server/IPedServer'
export * from './contracts/server/IPedAppearanceServer'
export * from './contracts/server/IPlayerServer'
export * from './contracts/server/IVehicleServer'
Expand Down
1 change: 1 addition & 0 deletions src/adapters/node/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export { NodeEngineEvents } from './node-engine-events'
export { NodeEntityServer } from './node-entity-server'
export { NodeExports } from './node-exports'
export { NodeHasher } from './node-hasher'
export { NodePedServer } from './node-ped-server'
export { NodeEvents } from './transport/node.events'
export { NodeRpc } from './transport/node.rpc'
export { NodePedAppearanceServer } from './node-ped-appearance-server'
Expand Down
52 changes: 52 additions & 0 deletions src/adapters/node/node-ped-server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { injectable } from 'tsyringe'
import { IPedServer } from '../contracts/server/IPedServer'

/** Node.js mock implementation of server-side ped operations. */
@injectable()
export class NodePedServer extends IPedServer {
private readonly byHandle = new Map<number, number>()
private readonly byNetworkId = new Map<number, number>()
private nextHandle = 2000
private nextNetworkId = 5000

create(
_pedType: number,
_modelHash: number,
_x: number,
_y: number,
_z: number,
_heading: number,
networked: boolean,
): number {
const handle = this.nextHandle++
this.byHandle.set(handle, 0)

if (networked) {
const netId = this.nextNetworkId++
this.byHandle.set(handle, netId)
this.byNetworkId.set(netId, handle)
}

return handle
}

delete(handle: number): void {
const netId = this.byHandle.get(handle)
if (netId && netId > 0) {
this.byNetworkId.delete(netId)
}
this.byHandle.delete(handle)
}

getNetworkIdFromEntity(handle: number): number {
return this.byHandle.get(handle) ?? 0
}

getEntityFromNetworkId(networkId: number): number {
return this.byNetworkId.get(networkId) ?? 0
}

networkIdExists(networkId: number): boolean {
return this.byNetworkId.has(networkId)
}
}
5 changes: 5 additions & 0 deletions src/adapters/node/node-platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { IPlayerInfo } from '../contracts/IPlayerInfo'
import { IResourceInfo } from '../contracts/IResourceInfo'
import { ITick } from '../contracts/ITick'
import { IEntityServer } from '../contracts/server/IEntityServer'
import { IPedServer } from '../contracts/server/IPedServer'
import { IPedAppearanceServer } from '../contracts/server/IPedAppearanceServer'
import { IPlayerServer } from '../contracts/server/IPlayerServer'
import { IVehicleServer } from '../contracts/server/IVehicleServer'
Expand Down Expand Up @@ -38,6 +39,7 @@ export const NodePlatform: PlatformAdapter = {
{ NodeTick },
{ NodePlayerInfo },
{ NodeEntityServer },
{ NodePedServer },
{ NodeVehicleServer },
{ NodePlayerServer },
{ NodeHasher },
Expand All @@ -51,6 +53,7 @@ export const NodePlatform: PlatformAdapter = {
import('./node-tick'),
import('./node-playerinfo'),
import('./node-entity-server'),
import('./node-ped-server'),
import('./node-vehicle-server'),
import('./node-player-server'),
import('./node-hasher'),
Expand Down Expand Up @@ -79,6 +82,8 @@ export const NodePlatform: PlatformAdapter = {
container.registerSingleton(IPlayerInfo as any, NodePlayerInfo)
if (!container.isRegistered(IEntityServer as any))
container.registerSingleton(IEntityServer as any, NodeEntityServer)
if (!container.isRegistered(IPedServer as any))
container.registerSingleton(IPedServer as any, NodePedServer)
if (!container.isRegistered(IVehicleServer as any))
container.registerSingleton(IVehicleServer as any, NodeVehicleServer)
if (!container.isRegistered(IPlayerServer as any))
Expand Down