diff --git a/package/client/resource/getClosestPlayer/index.ts b/package/client/resource/getClosestPlayer/index.ts new file mode 100644 index 00000000..eb7fb92a --- /dev/null +++ b/package/client/resource/getClosestPlayer/index.ts @@ -0,0 +1,34 @@ +import { Vector3 } from "@nativewrappers/fivem"; +import { cache } from '../../../shared/resource/cache/index'; + +export function getClosestPlayer( + coords: Vector3, + maxDistance: number = 2.0, + includePlayer?: boolean +): [number, number, Vector3] | undefined { + const players = GetActivePlayers(); + + let closestId: number | undefined; + let closestPed: number | undefined; + let closestCoords: Vector3 | undefined; + + for (let i = 0; i < players.length; i++) { + const playerId = players[i]; + + if (includePlayer || playerId !== cache.playerId) { + const playerPed = GetPlayerPed(playerId); + const [x, y, z] = GetEntityCoords(playerPed, false); + + const distance = coords.distance(new Vector3(x, y, z)); + + if (distance < maxDistance) { + maxDistance = distance; + closestId = playerId; + closestPed = playerPed; + closestCoords = new Vector3(x, y, z); + } + } + } + + return closestCoords ? [closestId as number, closestPed as number, closestCoords] : undefined; +} diff --git a/package/client/resource/index.ts b/package/client/resource/index.ts index 15e3aea6..a83335e7 100644 --- a/package/client/resource/index.ts +++ b/package/client/resource/index.ts @@ -15,3 +15,4 @@ export * from './callback'; export * from './points'; export * from './dui'; export * from './addKeybind'; +export * from './getClosestPlayer' diff --git a/package/server/resource/getClosestPlayer/index.ts b/package/server/resource/getClosestPlayer/index.ts new file mode 100644 index 00000000..9c6ad3e8 --- /dev/null +++ b/package/server/resource/getClosestPlayer/index.ts @@ -0,0 +1,32 @@ +import { Vector3 } from "@nativewrappers/fivem"; + +export function getClosestPlayer( + coords: Vector3, + maxDistance: number = 2.0, + ignorePlayerId?: number | false +): [number, number, Vector3] | undefined { + const players = GetActivePlayers(); + + let closestId: number | undefined; + let closestPed: number | undefined; + let closestCoords: Vector3 | undefined; + for (let i = 0; i < players.length; i++) { + const playerId = players[i]; + + if (!ignorePlayerId || playerId !== ignorePlayerId) { + const playerPed = GetPlayerPed(playerId); + const [x, y, z] = GetEntityCoords(playerPed, false); + + const distance = coords.distance(new Vector3(x, y, z)); + + if (distance < maxDistance) { + maxDistance = distance; + closestId = playerId; + closestPed = playerPed; + closestCoords = new Vector3(x, y, z); + } + } + } + + return closestCoords ? [closestId as number, closestPed as number, closestCoords] : undefined; +} diff --git a/package/server/resource/index.ts b/package/server/resource/index.ts index c3d2e07a..647c91b3 100644 --- a/package/server/resource/index.ts +++ b/package/server/resource/index.ts @@ -5,6 +5,7 @@ export * from './locale'; export * from './callback'; export * from './version'; export * from './addCommand'; +export * from './getClosestPlayer'; export function setVehicleProperties(vehicle: number, props: VehicleProperties) { Entity(vehicle).state.set('ox_lib:setVehicleProperties', props, true)