Fix sometimes disconnect get crash

This commit is contained in:
Kyle
2020-08-11 11:59:51 +08:00
parent 3350d8d9d9
commit f5218020a9
2 changed files with 36 additions and 38 deletions
+32 -34
View File
@@ -187,6 +187,12 @@ void TransmitManager::SDK_OnUnload()
void TransmitManager::OnEntityDestroyed(CBaseEntity* pEntity) void TransmitManager::OnEntityDestroyed(CBaseEntity* pEntity)
{ {
if (!pEntity)
{
smutils->LogError(myself, "OnEntityDestroyed -> nullptr detected...");
return;
}
auto entRef = gamehelpers->EntityToReference(pEntity); auto entRef = gamehelpers->EntityToReference(pEntity);
auto entity = gamehelpers->ReferenceToIndex(entRef); auto entity = gamehelpers->ReferenceToIndex(entRef);
@@ -202,28 +208,16 @@ void TransmitManager::OnEntityDestroyed(CBaseEntity* pEntity)
return; return;
} }
UnhookEntity(pEntity); UnhookEntity(entity);
} }
void TransmitManager::OnClientPutInServer(int client) void TransmitManager::OnClientPutInServer(int client)
{ {
auto*edict = gamehelpers->EdictOfIndex(client); auto *pPlayer = playerhelpers->GetGamePlayer(client);
if (!edict || edict->IsFree()) if (!pPlayer || pPlayer->IsFakeClient())
{ {
return; return;
} }
auto*player = playerhelpers->GetGamePlayer(edict);
if (!player)
{
return;
}
auto*unk = edict->GetUnknown();
if (!unk)
{
return;
}
auto*pEntity = unk->GetBaseEntity();
for (auto i = 1; i < MAX_EDICT; i++) for (auto i = 1; i < MAX_EDICT; i++)
{ {
@@ -235,35 +229,31 @@ void TransmitManager::OnClientPutInServer(int client)
g_Hooked[i]->SetSee(client, true); g_Hooked[i]->SetSee(client, true);
} }
// hooking self
HookEntity(pEntity);
} }
void TransmitManager::OnClientDisconnecting(int client) void TransmitManager::OnClientDisconnecting(int client)
{ {
auto* edict = gamehelpers->EdictOfIndex(client); auto* pPlayer = playerhelpers->GetGamePlayer(client);
if (!edict || edict->IsFree()) if (!pPlayer || pPlayer->IsFakeClient())
{
return;
}
auto* player = playerhelpers->GetGamePlayer(edict);
if (!player || !player->IsInGame())
{
return;
}
auto* unk = edict->GetUnknown();
if (!unk)
{ {
// not in-game = no hook
return; return;
} }
UnhookEntity(unk->GetBaseEntity()); UnhookEntity(client);
} }
void TransmitManager::HookEntity(CBaseEntity* pEntity) void TransmitManager::HookEntity(CBaseEntity* pEntity)
{ {
auto index = gamehelpers->EntityToBCompatRef(pEntity); auto index = gamehelpers->EntityToBCompatRef(pEntity);
if (!IsEntityIndexInRange(index))
{
// out-of-range
smutils->LogError(myself, "Failed to hook entity %d -> out-of-range.", index);
return;
}
if (g_Hooked[index] != nullptr) if (g_Hooked[index] != nullptr)
{ {
smutils->LogError(myself, "Entity Hook listener [%d] is not nullptr. Try to remove.", index); smutils->LogError(myself, "Entity Hook listener [%d] is not nullptr. Try to remove.", index);
@@ -271,19 +261,27 @@ void TransmitManager::HookEntity(CBaseEntity* pEntity)
} }
g_Hooked[index] = new HookingEntity(pEntity); g_Hooked[index] = new HookingEntity(pEntity);
//smutils->LogMessage(myself, "Hooked entity %d", index);
} }
void TransmitManager::UnhookEntity(CBaseEntity* pEntity) void TransmitManager::UnhookEntity(int index)
{ {
auto index = gamehelpers->EntityToBCompatRef(pEntity); if (!IsEntityIndexInRange(index))
{
// out-of-range
smutils->LogError(myself, "Failed to unhook entity %d -> out-of-range.", index);
return;
}
if (g_Hooked[index] == nullptr) if (g_Hooked[index] == nullptr)
{ {
smutils->LogError(myself, "Entity Hook listener %d is nullptr. Skipped.", index); //smutils->LogError(myself, "Entity Hook listener %d is nullptr. Skipped.", index);
return; return;
} }
delete g_Hooked[index]; delete g_Hooked[index];
g_Hooked[index] = nullptr; g_Hooked[index] = nullptr;
//smutils->LogMessage(myself, "Unhooked entity %d", index);
} }
static cell_t Native_SetEntityOwner(IPluginContext* pContext, const cell_t* params) static cell_t Native_SetEntityOwner(IPluginContext* pContext, const cell_t* params)
+1 -1
View File
@@ -27,7 +27,7 @@ private:
public: public:
void HookEntity(CBaseEntity* pEntity); void HookEntity(CBaseEntity* pEntity);
void UnhookEntity(CBaseEntity* pEntity); void UnhookEntity(int index);
}; };