diff --git a/src/Hooks.cpp b/src/Hooks.cpp index baca401..2576cc3 100644 --- a/src/Hooks.cpp +++ b/src/Hooks.cpp @@ -157,6 +157,7 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) { return Versions::getNetGame([ppRakServer](auto netGame, auto structs) -> Packet * { using Structs = decltype(structs); + using SyncTypes = Global::SyncTypes; Packet *p = CSAMPFunctions::Receive(ppRakServer); @@ -387,8 +388,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) } } - auto lastSyncData = &Versions::getLastSyncData(playerid); - if (Player::syncDataFrozen[playerid]) + auto lastSyncData = &Player::getLastSyncData(playerid); + if (Player::GetSyncFrozenState(playerid, SyncTypes::E_PLAYER_SYNC)) { std::memcpy(d, lastSyncData, sizeof(typename Structs::CSyncData)); } @@ -454,8 +455,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) return nullptr; } - auto lastAimSyncData = &Versions::getLastAimSyncData(playerid); - if (Player::syncAimDataFrozen[playerid]) + auto lastAimSyncData = &Player::getLastAimSyncData(playerid); + if (Player::GetSyncFrozenState(playerid, SyncTypes::E_AIM_SYNC)) { std::memcpy(d, lastAimSyncData, sizeof(typename Structs::CAimSyncData)); } @@ -508,8 +509,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) return nullptr; } - auto lastVehicleSyncData = &Versions::getLastVehicleSyncData(playerid); - if (Player::syncVehicleDataFrozen[playerid]) + auto lastVehicleSyncData = &Player::getLastVehicleSyncData(playerid); + if (Player::GetSyncFrozenState(playerid, SyncTypes::E_VEHICLE_SYNC)) { std::memcpy(d, lastVehicleSyncData, sizeof(typename Structs::CVehicleSyncData)); } @@ -552,8 +553,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) return nullptr; } - auto lastPassengerSyncData = &Versions::getLastPassengerSyncData(playerid); - if (Player::syncPassengerDataFrozen[playerid]) + auto lastPassengerSyncData = &Player::getLastPassengerSyncData(playerid); + if (Player::GetSyncFrozenState(playerid, SyncTypes::E_PASSENGER_SYNC)) { std::memcpy(d, lastPassengerSyncData, sizeof(typename Structs::CPassengerSyncData)); } @@ -596,8 +597,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer) return nullptr; } - auto lastSpectatingSyncData = &Versions::getLastSpectatingSyncData(playerid); - if (Player::syncSpectatingDataFrozen[playerid]) + auto lastSpectatingSyncData = &Player::getLastSpectatingSyncData(playerid); + if (Player::GetSyncFrozenState(playerid, SyncTypes::E_SPECTATING_SYNC)) { std::memcpy(d, lastSpectatingSyncData, sizeof(typename Structs::CSpectatingSyncData)); } diff --git a/src/Player.cpp b/src/Player.cpp index 87b9fd7..a566ab9 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -1,7 +1,7 @@ #include "Player.h" namespace Player -{ +{ BYTE lastWeapon[1000] = {0}; BYTE fakeHealth[1000] = {0}; BYTE fakeArmour[1000] = {0}; @@ -10,11 +10,62 @@ namespace Player BOOL blockKeySync[1000] = {0}; BOOL infiniteAmmo[1000] = {0}; - BOOL syncDataFrozen[1000] = {0}; - BOOL syncAimDataFrozen[1000] = {0}; - BOOL syncVehicleDataFrozen[1000] = {0}; - BOOL syncPassengerDataFrozen[1000] = {0}; - BOOL syncSpectatingDataFrozen[1000] = {0}; + BOOL syncOnFootDataFrozen[1000] = {0}; // Stores the frozen state for OnFoot Sync + BOOL syncAimDataFrozen[1000] = {0}; // Stores the frozen state for Aim Sync + BOOL syncVehicleDataFrozen[1000] = {0}; // Stores the frozen state for Vehicle Sync + BOOL syncPassengerDataFrozen[1000] = {0}; // Stores the frozen state for Passenger Sync + BOOL syncSpectatingDataFrozen[1000] = {0}; // Stores the frozen state for Spectating Sync - extern Global::SyncTypes lastSyncPacket[1000] = {Global::SyncTypes::E_PLAYER_SYNC}; + extern SyncTypes lastSyncPacket[1000] = {SyncTypes::E_PLAYER_SYNC}; // Stores the last packets type + + // Set the state of the sync data + void SetSyncFrozenState(int playerid, SyncTypes type, bool toggle) + { + switch(type) + { + case SyncTypes::E_PLAYER_SYNC: + syncOnFootDataFrozen[playerid] = toggle; + break; + + case SyncTypes::E_AIM_SYNC: + syncAimDataFrozen[playerid] = toggle; + break; + + case SyncTypes::E_VEHICLE_SYNC: + syncVehicleDataFrozen[playerid] = toggle; + break; + + case SyncTypes::E_PASSENGER_SYNC: + syncPassengerDataFrozen[playerid] = toggle; + break; + + case SyncTypes::E_SPECTATING_SYNC: + syncSpectatingDataFrozen[playerid] = toggle; + break; + } + } + + // Get the state of the sync data + BOOL GetSyncFrozenState(int playerid, Global::SyncTypes type) + { + switch(type) + { + case SyncTypes::E_PLAYER_SYNC: + return syncOnFootDataFrozen[playerid]; + + case SyncTypes::E_AIM_SYNC: + return syncAimDataFrozen[playerid]; + + case SyncTypes::E_VEHICLE_SYNC: + return syncVehicleDataFrozen[playerid]; + + case SyncTypes::E_PASSENGER_SYNC: + return syncPassengerDataFrozen[playerid]; + + case SyncTypes::E_SPECTATING_SYNC: + return syncSpectatingDataFrozen[playerid]; + } + + return -1; + } }; \ No newline at end of file diff --git a/src/Player.h b/src/Player.h index 9826dcd..8396295 100644 --- a/src/Player.h +++ b/src/Player.h @@ -12,6 +12,8 @@ namespace Player { + using SyncTypes = Global::SyncTypes; + extern BYTE lastWeapon[MAX_PLAYERS]; extern BYTE fakeHealth[MAX_PLAYERS]; extern BYTE fakeArmour[MAX_PLAYERS]; @@ -26,7 +28,50 @@ namespace Player extern BOOL syncPassengerDataFrozen[MAX_PLAYERS]; extern BOOL syncSpectatingDataFrozen[MAX_PLAYERS]; - extern Global::SyncTypes lastSyncPacket[MAX_PLAYERS]; + extern Global::SyncTypes lastSyncPacket[MAX_PLAYERS]; + + extern void SetSyncFrozenState(int playerid, SyncTypes type, bool toggle); + extern BOOL GetSyncFrozenState(int playerid, SyncTypes type); + + // Returns the last sync data stored for the struct CSyncData + template + auto &getLastSyncData(int playerid) + { + static typename Struct::CSyncData data[MAX_PLAYERS]; + return data[playerid]; + } + + // Returns the last sync data stored for the struct CAimSyncData + template + auto &getLastAimSyncData(int playerid) + { + static typename Struct::CAimSyncData data[MAX_PLAYERS]; + return data[playerid]; + } + + // Returns the last sync data stored for the struct CVehicleSyncData + template + auto &getLastVehicleSyncData(int playerid) + { + static typename Struct::CVehicleSyncData data[MAX_PLAYERS]; + return data[playerid]; + } + + // Returns the last sync data stored for the struct CPassengerSyncData + template + auto &getLastPassengerSyncData(int playerid) + { + static typename Struct::CPassengerSyncData data[MAX_PLAYERS]; + return data[playerid]; + } + + // Returns the last sync data stored for the struct CSpectatingSyncData + template + auto &getLastSpectatingSyncData(int playerid) + { + static typename Struct::CSpectatingSyncData data[MAX_PLAYERS]; + return data[playerid]; + } }; #endif \ No newline at end of file diff --git a/src/Scripting.cpp b/src/Scripting.cpp index 736c675..be5713e 100644 --- a/src/Scripting.cpp +++ b/src/Scripting.cpp @@ -94,13 +94,13 @@ static cell AMX_NATIVE_CALL SetLastAnimationData(AMX *amx, cell *params) using Structs = decltype(structs); int playerid = (int)params[1]; - int data = (int)params[2]; + int animation = (int)params[2]; if(!IsPlayerConnected(playerid)) return 0; - auto *d = &Versions::getLastSyncData(playerid); - d->dwAnimationData = data; + auto *d = &Player::getLastSyncData(playerid); + d->dwAnimationData = animation; return 1; }); @@ -351,6 +351,7 @@ static cell AMX_NATIVE_CALL FreezeSyncData(AMX *amx, cell *params) return Versions::getNetGame([params](auto netGame, auto structs) { using Structs = decltype(structs); + using SyncTypes = Global::SyncTypes; int playerid = (int)params[1]; BOOL toggle = (BOOL)params[2]; @@ -358,14 +359,14 @@ static cell AMX_NATIVE_CALL FreezeSyncData(AMX *amx, cell *params) if(!IsPlayerConnected(playerid)) return 0; - auto *d = &Versions::getLastSyncData(playerid); + auto *d = &Player::getLastSyncData(playerid); d->vecVelocity = CVector(); d->byteSpecialAction = 0; d->wKeys = 0; d->wUDAnalog = 0; d->wLRAnalog = 0; - Player::syncDataFrozen[playerid] = toggle; + Player::SetSyncFrozenState(playerid, SyncTypes::E_PLAYER_SYNC, toggle); return 1; }); @@ -378,6 +379,7 @@ static cell AMX_NATIVE_CALL FreezeSyncPacket(AMX *amx, cell *params) return Versions::getNetGame([params](auto netGame, auto structs) { using Structs = decltype(structs); + using SyncTypes = Global::SyncTypes; int playerid = static_cast(params[1]); int type = static_cast(params[2]); @@ -386,62 +388,64 @@ static cell AMX_NATIVE_CALL FreezeSyncPacket(AMX *amx, cell *params) if(!IsPlayerConnected(playerid)) return 0; - if(type == Global::SyncTypes::E_LAST_SYNC) + if(type == SyncTypes::E_LAST_SYNC) { type = static_cast(Player::lastSyncPacket[playerid]); } switch(type) { - case Global::SyncTypes::E_PLAYER_SYNC: // Player Sync + case SyncTypes::E_PLAYER_SYNC: // Player Sync { - auto *d = &Versions::getLastSyncData(playerid); + auto *d = &Player::getLastSyncData(playerid); d->vecVelocity = CVector(); d->byteSpecialAction = 0; d->wKeys = 0; d->wUDAnalog = 0; d->wLRAnalog = 0; - Player::syncDataFrozen[playerid] = toggle; + Player::SetSyncFrozenState(playerid, SyncTypes::E_PLAYER_SYNC, toggle); break; } - case Global::SyncTypes::E_AIM_SYNC: // Aim Sync + case SyncTypes::E_AIM_SYNC: // Aim Sync { Player::syncAimDataFrozen[playerid] = toggle; break; } - case Global::SyncTypes::E_VEHICLE_SYNC: // Vehicle Sync + case SyncTypes::E_VEHICLE_SYNC: // Vehicle Sync { - auto *d = &Versions::getLastVehicleSyncData(playerid); + auto *d = &Player::getLastVehicleSyncData(playerid); d->vecVelocity = CVector(); d->wKeys = 0; d->wUDAnalog = 0; d->wLRAnalog = 0; - Player::syncVehicleDataFrozen[playerid] = toggle; + Player::SetSyncFrozenState(playerid, SyncTypes::E_VEHICLE_SYNC, toggle); break; } - case Global::SyncTypes::E_PASSENGER_SYNC: // Passenger Sync + case SyncTypes::E_PASSENGER_SYNC: // Passenger Sync { - auto *d = &Versions::getLastPassengerSyncData(playerid); + auto *d = &Player::getLastPassengerSyncData(playerid); d->wKeys = 0; d->wUDAnalog = 0; d->wLRAnalog = 0; - Player::syncPassengerDataFrozen[playerid] = toggle; + Player::SetSyncFrozenState(playerid, SyncTypes::E_PASSENGER_SYNC, toggle); + break; } - case Global::SyncTypes::E_SPECTATING_SYNC: // Spectate Sync + case SyncTypes::E_SPECTATING_SYNC: // Spectate Sync { - auto *d = &Versions::getLastSpectatingSyncData(playerid); + auto *d = &Player::getLastSpectatingSyncData(playerid); d->wKeysOnSpectating = 0; d->wUpDownKeysOnSpectating = 0; d->wLeftRightKeysOnSpectating = 0; - Player::syncSpectatingDataFrozen[playerid] = toggle; + Player::SetSyncFrozenState(playerid, SyncTypes::E_SPECTATING_SYNC, toggle); + break; } default: diff --git a/src/Versions.h b/src/Versions.h index f93d848..2589eef 100644 --- a/src/Versions.h +++ b/src/Versions.h @@ -52,53 +52,27 @@ namespace Versions static samp_037::CNetGame *netGame = reinterpret_cast(pNetGame); return func(netGame, samp_037()); } - } - - // Returns the last sync data stored for the struct CSyncData - template - auto &getLastSyncData(int playerid) - { - static typename Struct::CSyncData data[MAX_PLAYERS]; - return data[playerid]; - } - - // Returns the last sync data stored for the struct CAimSyncData - template - auto &getLastAimSyncData(int playerid) - { - static typename Struct::CAimSyncData data[MAX_PLAYERS]; - return data[playerid]; - } - - // Returns the last sync data stored for the struct CVehicleSyncData - template - auto &getLastVehicleSyncData(int playerid) - { - static typename Struct::CVehicleSyncData data[MAX_PLAYERS]; - return data[playerid]; - } - - // Returns the last sync data stored for the struct CPassengerSyncData - template - auto &getLastPassengerSyncData(int playerid) - { - static typename Struct::CPassengerSyncData data[MAX_PLAYERS]; - return data[playerid]; - } - - // Returns the last sync data stored for the struct CSpectatingSyncData - template - auto &getLastSpectatingSyncData(int playerid) - { - static typename Struct::CSpectatingSyncData data[MAX_PLAYERS]; - return data[playerid]; - } + } + + // auto getNetGame2() + // { + // if (iVersion == eSAMPVersion::SAMP_VERSION_03DL_R1) + // { + // static samp_03dl::CNetGame *netGame = reinterpret_cast(pNetGame); + // return {netGame, samp_03dl()}; + // } + // else + // { + // static samp_037::CNetGame *netGame = reinterpret_cast(pNetGame); + // return func(netGame, samp_037()); + // } + // } // Writes a CSyncData struct to a bitstream instance template void sendSyncData(int playerid, int animation, RakNet::BitStream *bs) { - auto *d = &getLastSyncData(playerid); + auto *d = &Player::getLastSyncData(playerid); bs->Write((BYTE)ID_PLAYER_SYNC); bs->Write((WORD)playerid); @@ -190,8 +164,7 @@ namespace Versions bs->Write((BYTE)((health << 4) | (armour))); - bs->Write(d->byteWeapon); - bs->Write(d->byteAdditionalKeys); + bs->Write((BYTE)((d->byteAdditionalKeys << 6) | (d->byteWeapon))); bs->Write(d->byteSpecialAction); // Make them appear standing still if paused @@ -209,9 +182,7 @@ namespace Versions bs->Write(true); bs->Write(d->wSurfingInfo); - bs->Write(d->vecSurfing.fX); - bs->Write(d->vecSurfing.fY); - bs->Write(d->vecSurfing.fZ); + bs->WriteVector(d->vecSurfing.fX, d->vecSurfing.fY, d->vecSurfing.fZ); } else { @@ -219,10 +190,11 @@ namespace Versions } // Animations are only sent when they are changed - if (animation) + if (animation ) { bs->Write(true); - bs->Write((DWORD)d->dwAnimationData); + bs->Write((DWORD)d->wAnimIndex); + bs->Write((DWORD)d->wAnimFlags); } else { @@ -234,7 +206,7 @@ namespace Versions template void sendAimSyncData(int playerid, RakNet::BitStream *bs) { - auto *d = &getLastAimSyncData(playerid); + auto *d = &Player::getLastAimSyncData(playerid); bs->Write((BYTE)ID_AIM_SYNC); bs->Write((WORD)playerid); @@ -283,7 +255,7 @@ namespace Versions template void sendVehicleSyncData(int playerid, RakNet::BitStream *bs) { - auto *d = &getLastVehicleSyncData(playerid); + auto *d = &Player::getLastVehicleSyncData(playerid); bs->Write((BYTE)ID_VEHICLE_SYNC); bs->Write((WORD)playerid); @@ -375,8 +347,7 @@ namespace Versions bs->Write((BYTE)((health << 4) | (armour))); - bs->Write(d->bytePlayerWeapon); - bs->Write(d->byteAdditionalKeys); + bs->Write((BYTE)(d->bytePlayerWeapon << 2) | (d->byteAdditionalKeys)); if(d->byteSirenState) { @@ -421,7 +392,7 @@ namespace Versions template void sendPassengerSyncData(int playerid, RakNet::BitStream *bs) { - auto *d = &getLastPassengerSyncData(playerid); + auto *d = &Player::getLastPassengerSyncData(playerid); bs->Write((BYTE)ID_PASSENGER_SYNC); bs->Write((WORD)playerid); @@ -501,7 +472,7 @@ namespace Versions template void sendSpectatingSyncData(int playerid, RakNet::BitStream *bs) { - auto *d = &getLastSpectatingSyncData(playerid); + auto *d = &Player::getLastSpectatingSyncData(playerid); bs->Write((BYTE)ID_SPECTATOR_SYNC); bs->Write((WORD)playerid);