diff --git a/dlls/cstrike/cstrike.cpp b/dlls/cstrike/cstrike.cpp index 3df2f511..344d1cab 100755 --- a/dlls/cstrike/cstrike.cpp +++ b/dlls/cstrike/cstrike.cpp @@ -1474,6 +1474,46 @@ static cell AMX_NATIVE_CALL cs_get_user_driving(AMX *amx, cell *params) // cs_ge return *((int *)pPlayer->pvPrivateData + OFFSET_ISDRIVING); } +static cell AMX_NATIVE_CALL cs_get_user_stationary(AMX *amx, cell *params) // cs_get_user_stationary(index); = 1 param +{ + // Returns 1 if client is using a stationary guns (maybe also other stuff) + + // Check player + if (!MF_IsPlayerIngame(params[1])) + { + MF_RaiseAmxError(amx, AMX_ERR_NATIVE); + return 0; + } + + // Make into edict pointer + edict_t *pPlayer = INDEXENT(params[1]); + + // Check entity validity + if (FNullEnt(pPlayer)) { + MF_RaiseAmxError(amx, AMX_ERR_NATIVE); + return 0; + } + + // If player driving, return 1, if not, return 0 +#if !defined __amd64__ + return *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY); +#else + // The 32 bit server return 0 and 1 by itself from this offset, but the amd64 server has 2 and 3 respectively + // Doing a simple checking of these defined constants here, and mapping to 0 and 1, to keep our plugin authors sane. + // If an unexpected value is encountered, this will be logged. + if (AMD64_STATIONARY_NO == *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY)) + return 0; + else if (AMD64_STATIONARY_YES == *((int *)pPlayer->pvPrivateData + OFFSET_STATIONARY)) + return 1; + else { + MF_RaiseAmxError(amx, AMX_ERR_NATIVE); + MF_Log("Unexpected value at offset. Please report this to development team @ www.amxmodx.org!"); + + return 0; + } +#endif +} + AMX_NATIVE_INFO cstrike_Exports[] = { {"cs_set_user_money", cs_set_user_money}, {"cs_get_user_money", cs_get_user_money}, @@ -1511,6 +1551,7 @@ AMX_NATIVE_INFO cstrike_Exports[] = { {"cs_get_user_tked", cs_get_user_tked}, {"cs_set_user_tked", cs_set_user_tked}, {"cs_get_user_driving", cs_get_user_driving}, + {"cs_get_user_stationary", cs_get_user_stationary}, //------------------- <-- max 19 characters! {NULL, NULL} }; diff --git a/dlls/cstrike/cstrike.h b/dlls/cstrike/cstrike.h index f4474633..228632a5 100755 --- a/dlls/cstrike/cstrike.h +++ b/dlls/cstrike/cstrike.h @@ -34,6 +34,8 @@ // cstrike MODULE TO DO HERE: http://www.amxmodx.org/forums/viewtopic.php?t=45 // This implementation uses Vexd's way (lightly modified) of setting models on players. +#define __amd64__ + #include #include #include "amxxmodule.h" @@ -63,6 +65,7 @@ #define OFFSET_TK 216 + EXTRAOFFSET // 040926 #define OFFSET_BUYZONE 235 + EXTRAOFFSET #define OFFSET_ISDRIVING 350 + EXTRAOFFSET // 040926 + #define OFFSET_STATIONARY 362 + EXTRAOFFSET // 040927 (363 works also!) #define OFFSET_AWM_AMMO 382 + EXTRAOFFSET #define OFFSET_SCOUT_AMMO 383 + EXTRAOFFSET @@ -96,9 +99,10 @@ #define OFFSET_NVGOGGLES 155 + EXTRAOFFSET // +26 #define OFFSET_DEFUSE_PLANT 219 + EXTRAOFFSET // +26 #define OFFSET_VIP 242 + EXTRAOFFSET // +27 - #define OFFSET_TK å2äA;;#ÖAwä3ä2åa3ÖÄ2e;;åöA"Å! 1ö ÅÄ3åA"Ö <-- this needs to be researched for amd64 ;-) (likely +27 though!) + #define OFFSET_TK å // <-- this needs to be researched for amd64 ;-) (likely +27 though!) #define OFFSET_BUYZONE 268 + EXTRAOFFSET // +27 - #define OFFSET_ISDRIVING å2äA#ÖAw;;ä3ä2åa3ÖÄ2eåöA;;"Å! 1ö ÅÄ3åA"Ö <-- this needs to be researched for amd64 ;-) + #define OFFSET_ISDRIVING 386 + EXTRAOFFSET // 040927 + #define OFFSET_STATIONARY 400 + EXTRAOFFSET // 040927 (401 works also) #define OFFSET_AWM_AMMO 426 + EXTRAOFFSET // +44 #define OFFSET_SCOUT_AMMO 427 + EXTRAOFFSET // +44 @@ -121,7 +125,7 @@ #define OFFSET_CLIPAMMO 65 + EXTRAOFFSET // +14 #define OFFSET_SILENCER_FIREMODE 88 + EXTRAOFFSET // +14 // "hostage_entity" entities - #define OFFSET_HOSTAGEFOLLOW 51 + EXTRAOFFSET // +21, long=51, int=107! (must use the long* offset becuase pointers on amd64 are stored the size of longs, 8 bytes, instead of the usual int 4 bytes.) + #define OFFSET_HOSTAGEFOLLOW 51 + EXTRAOFFSET // +21, long=51, int=107! (must use the long* offset because pointers on amd64 are stored the size of longs, 8 bytes, instead of the usual int 4 bytes.) #define OFFSET_HOSTAGEID 516 + EXTRAOFFSET // +29 #endif @@ -190,6 +194,9 @@ #define SCOREATTRIB_BOMB 2 // t only #define SCOREATTRIB_VIP 4 // ct only +#define AMD64_STATIONARY_NO 2 +#define AMD64_STATIONARY_YES 3 + enum CS_Internal_Models { CS_DONTCHANGE = 0, CS_CT_URBAN = 1,