Skip to content

Commit

Permalink
Fixed a problem with players vanishing when shot
Browse files Browse the repository at this point in the history
  • Loading branch information
ADRFranklin committed Dec 31, 2019
1 parent 1bd6e7b commit cd6c099
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 92 deletions.
21 changes: 11 additions & 10 deletions src/Hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -387,8 +388,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer)
}
}

auto lastSyncData = &Versions::getLastSyncData<Structs>(playerid);
if (Player::syncDataFrozen[playerid])
auto lastSyncData = &Player::getLastSyncData<Structs>(playerid);
if (Player::GetSyncFrozenState(playerid, SyncTypes::E_PLAYER_SYNC))
{
std::memcpy(d, lastSyncData, sizeof(typename Structs::CSyncData));
}
Expand Down Expand Up @@ -454,8 +455,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer)
return nullptr;
}

auto lastAimSyncData = &Versions::getLastAimSyncData<Structs>(playerid);
if (Player::syncAimDataFrozen[playerid])
auto lastAimSyncData = &Player::getLastAimSyncData<Structs>(playerid);
if (Player::GetSyncFrozenState(playerid, SyncTypes::E_AIM_SYNC))
{
std::memcpy(d, lastAimSyncData, sizeof(typename Structs::CAimSyncData));
}
Expand Down Expand Up @@ -508,8 +509,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer)
return nullptr;
}

auto lastVehicleSyncData = &Versions::getLastVehicleSyncData<Structs>(playerid);
if (Player::syncVehicleDataFrozen[playerid])
auto lastVehicleSyncData = &Player::getLastVehicleSyncData<Structs>(playerid);
if (Player::GetSyncFrozenState(playerid, SyncTypes::E_VEHICLE_SYNC))
{
std::memcpy(d, lastVehicleSyncData, sizeof(typename Structs::CVehicleSyncData));
}
Expand Down Expand Up @@ -552,8 +553,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer)
return nullptr;
}

auto lastPassengerSyncData = &Versions::getLastPassengerSyncData<Structs>(playerid);
if (Player::syncPassengerDataFrozen[playerid])
auto lastPassengerSyncData = &Player::getLastPassengerSyncData<Structs>(playerid);
if (Player::GetSyncFrozenState(playerid, SyncTypes::E_PASSENGER_SYNC))
{
std::memcpy(d, lastPassengerSyncData, sizeof(typename Structs::CPassengerSyncData));
}
Expand Down Expand Up @@ -596,8 +597,8 @@ Packet *THISCALL CHookRakServer::Receive(void *ppRakServer)
return nullptr;
}

auto lastSpectatingSyncData = &Versions::getLastSpectatingSyncData<Structs>(playerid);
if (Player::syncSpectatingDataFrozen[playerid])
auto lastSpectatingSyncData = &Player::getLastSpectatingSyncData<Structs>(playerid);
if (Player::GetSyncFrozenState(playerid, SyncTypes::E_SPECTATING_SYNC))
{
std::memcpy(d, lastSpectatingSyncData, sizeof(typename Structs::CSpectatingSyncData));
}
Expand Down
65 changes: 58 additions & 7 deletions src/Player.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "Player.h"

namespace Player
{
{
BYTE lastWeapon[1000] = {0};
BYTE fakeHealth[1000] = {0};
BYTE fakeArmour[1000] = {0};
Expand All @@ -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;
}
};
47 changes: 46 additions & 1 deletion src/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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 <typename Struct>
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 <typename Struct>
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 <typename Struct>
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 <typename Struct>
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 <typename Struct>
auto &getLastSpectatingSyncData(int playerid)
{
static typename Struct::CSpectatingSyncData data[MAX_PLAYERS];
return data[playerid];
}
};

#endif
42 changes: 23 additions & 19 deletions src/Scripting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<Structs>(playerid);
d->dwAnimationData = data;
auto *d = &Player::getLastSyncData<Structs>(playerid);
d->dwAnimationData = animation;

return 1;
});
Expand Down Expand Up @@ -351,21 +351,22 @@ 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];

if(!IsPlayerConnected(playerid))
return 0;

auto *d = &Versions::getLastSyncData<Structs>(playerid);
auto *d = &Player::getLastSyncData<Structs>(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;
});
Expand All @@ -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<int>(params[1]);
int type = static_cast<int>(params[2]);
Expand All @@ -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<int>(Player::lastSyncPacket[playerid]);
}

switch(type)
{
case Global::SyncTypes::E_PLAYER_SYNC: // Player Sync
case SyncTypes::E_PLAYER_SYNC: // Player Sync
{
auto *d = &Versions::getLastSyncData<Structs>(playerid);
auto *d = &Player::getLastSyncData<Structs>(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<Structs>(playerid);
auto *d = &Player::getLastVehicleSyncData<Structs>(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<Structs>(playerid);
auto *d = &Player::getLastPassengerSyncData<Structs>(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<Structs>(playerid);
auto *d = &Player::getLastSpectatingSyncData<Structs>(playerid);
d->wKeysOnSpectating = 0;
d->wUpDownKeysOnSpectating = 0;
d->wLeftRightKeysOnSpectating = 0;

Player::syncSpectatingDataFrozen[playerid] = toggle;
Player::SetSyncFrozenState(playerid, SyncTypes::E_SPECTATING_SYNC, toggle);
break;
}

default:
Expand Down
Loading

0 comments on commit cd6c099

Please sign in to comment.