From 0afe0a4965a5bfbe6433d34154ff99143b359cef Mon Sep 17 00:00:00 2001 From: RD42 <42702181+dashr9230@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:37:30 +0800 Subject: [PATCH] [server] Implement/match `n_IsPlayerInVehicle(...)` --- server/player.h | 18 ++++++++++++++++-- server/scrcustom.cpp | 13 ++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/server/player.h b/server/player.h index dbd5327..5882bab 100644 --- a/server/player.h +++ b/server/player.h @@ -2,6 +2,17 @@ #ifndef SAMPSRV_PLAYER_H #define SAMPSRV_PLAYER_H +#define PLAYER_STATE_NONE 0 +#define PLAYER_STATE_ONFOOT 1 +#define PLAYER_STATE_DRIVER 2 +#define PLAYER_STATE_PASSENGER 3 +#define PLAYER_STATE_EXIT_VEHICLE 4 +#define PLAYER_STATE_ENTER_VEHICLE_DRIVER 5 +#define PLAYER_STATE_ENTER_VEHICLE_PASSENGER 6 +#define PLAYER_STATE_WASTED 7 +#define PLAYER_STATE_SPAWNED 8 +#define PLAYER_STATE_SPECTATING 9 + #pragma pack(1) typedef struct _PLAYER_SPAWN_INFO { @@ -147,7 +158,7 @@ public: char _pad2BA5[4]; - char field_2BA9; + BYTE m_byteState; VECTOR m_vecCheckpoint; float m_fCheckpointSize; @@ -167,7 +178,7 @@ public: char field_2C2F; char field_2C30; char field_2C31; - short field_2C32; + VEHICLEID m_VehicleID; int field_2C34; BOOL m_bCheckpointEnabled; BOOL m_bRaceCheckpointEnabled; @@ -199,6 +210,9 @@ public: int field_2CDA; + + BYTE GetState() { return m_byteState; }; + void Say(unsigned char * szText, BYTE byteTextLength); void SetSpawnInfo(PLAYER_SPAWN_INFO *pSpawn); diff --git a/server/scrcustom.cpp b/server/scrcustom.cpp index 03adc21..d21da96 100644 --- a/server/scrcustom.cpp +++ b/server/scrcustom.cpp @@ -977,9 +977,20 @@ static cell AMX_NATIVE_CALL n_RemovePlayerFromVehicle(AMX *amx, cell *params) return 0; } +// native IsPlayerInVehicle(playerid, vehicleid) static cell AMX_NATIVE_CALL n_IsPlayerInVehicle(AMX *amx, cell *params) { - // TODO: IsPlayerInVehicle + CPlayer* pPlayer = pNetGame->GetPlayerPool()->GetAt((PLAYERID)params[1]); + if (!pPlayer) return 0; + BYTE byteState = pPlayer->GetState(); + if ((byteState == PLAYER_STATE_DRIVER) || (byteState == PLAYER_STATE_PASSENGER)) + { + if (pPlayer->m_VehicleID == params[2]) + { + return 1; + } + } + return 0; }