Reconcile the concept of Edict & Networkable across the codebase (#1903)
* Reconcile the concept of Edict & Networkable across the codebase * There's no need to check this, it's done elsewhere. Also could be null (segfault) * This was never needed * Pseudo review changes Re-added removed null checks, and added new ones. Changed the error messages in Get/SetProp natives to better reflect reality. * Don't change the behaviour of GetEntityNetClass * Overload IGameHelpers::FindServerClass * Make error messages more accurate * Fix a dev comment * Rename FindServerClass --------- Co-authored-by: Kenzzer <[email protected]>
This commit is contained in:
@@ -45,26 +45,27 @@ static CBaseEntity *FindEntityByNetClass(int start, const char *classname)
|
||||
int maxEntities = gpGlobals->maxEntities;
|
||||
for (int i = start; i < maxEntities; i++)
|
||||
{
|
||||
edict_t *current = gamehelpers->EdictOfIndex(i);
|
||||
if (current == NULL || current->IsFree())
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
|
||||
if (pEntity == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
IServerNetworkable *network = current->GetNetworkable();
|
||||
if (network == NULL)
|
||||
ServerClass *pServerClass = gamehelpers->FindEntityServerClass(pEntity);
|
||||
if (pServerClass == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
IHandleEntity *pHandleEnt = network->GetEntityHandle();
|
||||
if (pHandleEnt == NULL)
|
||||
continue;
|
||||
|
||||
ServerClass *sClass = network->GetServerClass();
|
||||
const char *name = sClass->GetName();
|
||||
|
||||
const char *name = pServerClass->GetName();
|
||||
if (!strcmp(name, classname))
|
||||
return gamehelpers->ReferenceToEntity(gamehelpers->IndexOfEdict(current));
|
||||
{
|
||||
return pEntity;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static CBaseEntity* GetGameRulesProxyEnt()
|
||||
|
||||
@@ -50,19 +50,20 @@ void InitTeamNatives()
|
||||
|
||||
int edictCount = gpGlobals->maxEntities;
|
||||
|
||||
for (int i=0; i<edictCount; i++)
|
||||
for (int i = 0; i < edictCount; i++)
|
||||
{
|
||||
edict_t *pEdict = PEntityOfEntIndex(i);
|
||||
if (!pEdict || pEdict->IsFree())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!pEdict->GetNetworkable())
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
|
||||
if (pEntity == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ServerClass *pClass = pEdict->GetNetworkable()->GetServerClass();
|
||||
ServerClass *pClass = gamehelpers->FindEntityServerClass(pEntity);
|
||||
if (pClass == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FindNestedDataTable(pClass->m_pTable, "DT_Team"))
|
||||
{
|
||||
SendProp *pTeamNumProp = g_pGameHelpers->FindInSendTable(pClass->GetName(), "m_iTeamNum");
|
||||
@@ -70,15 +71,14 @@ void InitTeamNatives()
|
||||
if (pTeamNumProp != NULL)
|
||||
{
|
||||
int offset = pTeamNumProp->GetOffset();
|
||||
CBaseEntity *pEnt = pEdict->GetUnknown()->GetBaseEntity();
|
||||
int TeamIndex = *(int *)((unsigned char *)pEnt + offset);
|
||||
int TeamIndex = *(int *)((unsigned char *)pEntity + offset);
|
||||
|
||||
if (TeamIndex >= (int)g_Teams.size())
|
||||
{
|
||||
g_Teams.resize(TeamIndex+1);
|
||||
}
|
||||
g_Teams[TeamIndex].ClassName = pClass->GetName();
|
||||
g_Teams[TeamIndex].pEnt = pEnt;
|
||||
g_Teams[TeamIndex].pEnt = pEntity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -321,28 +321,23 @@ void GetResourceEntity()
|
||||
{
|
||||
int edictCount = gpGlobals->maxEntities;
|
||||
|
||||
for (int i=0; i<edictCount; i++)
|
||||
for (int i = 0; i < edictCount; i++)
|
||||
{
|
||||
edict_t *pEdict = PEntityOfEntIndex(i);
|
||||
if (!pEdict || pEdict->IsFree())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!pEdict->GetNetworkable())
|
||||
CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
|
||||
if (pEntity == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
IHandleEntity *pHandleEnt = pEdict->GetNetworkable()->GetEntityHandle();
|
||||
if (!pHandleEnt)
|
||||
ServerClass *pClass = gamehelpers->FindEntityServerClass(pEntity);
|
||||
if (pClass == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ServerClass *pClass = pEdict->GetNetworkable()->GetServerClass();
|
||||
|
||||
if (FindNestedDataTable(pClass->m_pTable, "DT_PlayerResource"))
|
||||
{
|
||||
g_ResourceEntity = pHandleEnt->GetRefEHandle();
|
||||
g_ResourceEntity = ((IHandleEntity *)pEntity)->GetRefEHandle();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1689,7 +1689,12 @@ static cell_t LookupEntityAttachment(IPluginContext* pContext, const cell_t* par
|
||||
CBaseEntity* pEntity;
|
||||
ENTINDEX_TO_CBASEENTITY(params[1], pEntity);
|
||||
|
||||
ServerClass* pClass = ((IServerUnknown*)pEntity)->GetNetworkable()->GetServerClass();
|
||||
ServerClass* pClass = gamehelpers->FindEntityServerClass(pEntity);
|
||||
if (pClass == nullptr)
|
||||
{
|
||||
return pContext->ThrowNativeError("Failed to retrieve entity %d (%d) server class!", gamehelpers->ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!FindNestedDataTable(pClass->m_pTable, "DT_BaseAnimating"))
|
||||
{
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is not a CBaseAnimating", gamehelpers->ReferenceToIndex(params[1]), params[1]);
|
||||
@@ -1735,7 +1740,12 @@ static cell_t GetEntityAttachment(IPluginContext* pContext, const cell_t* params
|
||||
CBaseEntity* pEntity;
|
||||
ENTINDEX_TO_CBASEENTITY(params[1], pEntity);
|
||||
|
||||
ServerClass* pClass = ((IServerUnknown*)pEntity)->GetNetworkable()->GetServerClass();
|
||||
ServerClass* pClass = gamehelpers->FindEntityServerClass(pEntity);
|
||||
if (pClass == nullptr)
|
||||
{
|
||||
return pContext->ThrowNativeError("Failed to retrieve entity %d (%d) server class!", gamehelpers->ReferenceToIndex(params[1]), params[1]);
|
||||
}
|
||||
|
||||
if (!FindNestedDataTable(pClass->m_pTable, "DT_BaseAnimating"))
|
||||
{
|
||||
return pContext->ThrowNativeError("Entity %d (%d) is not a CBaseAnimating", gamehelpers->ReferenceToIndex(params[1]), params[1]);
|
||||
|
||||
Reference in New Issue
Block a user