CEntitySaveRestoreBlockHandler::RestoreGlobalEntity
0x004ab9d0 · 478 bytes · __thiscall
_ZN30CEntitySaveRestoreBlockHandler19RestoreGlobalEntityEP11CBaseEntityP16CSaveRestoreDataP13entitytable_t
Decompiled
undefined (4 params)
/* CEntitySaveRestoreBlockHandler::RestoreGlobalEntity(CBaseEntity*, CSaveRestoreData*,
entitytable_t*) */
undefined4 __thiscall
CEntitySaveRestoreBlockHandler::RestoreGlobalEntity
(CEntitySaveRestoreBlockHandler *this,CBaseEntity *param_1,CSaveRestoreData *param_2,
entitytable_t *param_3)
{
float fVar1;
float fVar2;
char *pcVar3;
char cVar4;
int iVar5;
CSaveRestoreData *pCVar6;
int iVar7;
CBaseEntity *pCVar8;
undefined4 uVar9;
undefined4 *puVar10;
char *pcVar11;
CEntitySaveRestoreBlockHandler *pCVar12;
float local_50;
float local_4c;
float local_48;
undefined **local_44;
undefined4 local_40 [3];
undefined4 local_34;
undefined4 local_30;
undefined4 local_24;
if (param_1 != (CBaseEntity *)0x0) {
(**(code **)(*(int *)param_1 + 0xc))(param_1);
}
CRestore::CRestore((CRestore *)&local_44,param_2);
pcVar3 = *(char **)(param_3 + 0x24);
uVar9 = *(undefined4 *)(param_3 + 0x20);
pcVar11 = "";
if (pcVar3 != (char *)0x0) {
pcVar11 = pcVar3;
}
/* try { // try from 004aba16 to 004abbb1 has its CatchHandler @ 004abbb7 */
iVar5 = GlobalEntity_GetIndex(pcVar11);
pCVar6 = (CSaveRestoreData *)GlobalEntity_GetMap(iVar5);
if (pCVar6 == param_2 + 0x544) {
LAB_004aba44:
pCVar8 = (CBaseEntity *)FindGlobalEntity(this,uVar9,pcVar3);
if (pCVar8 == (CBaseEntity *)0x0) {
pcVar11 = "";
if (pcVar3 != (char *)0x0) {
pcVar11 = pcVar3;
}
DevMsg("Warning: No match for global entity %s found in destination level\n",pcVar11);
}
else {
local_24 = 1;
uVar9 = (**(code **)(*(int *)pCVar8 + 0x1c))(pCVar8);
pCVar12 = this;
ModelSpaceLandmark((int)&local_50);
fVar1 = *(float *)(param_3 + 0x30);
fVar2 = *(float *)(param_3 + 0x28);
*(float *)(param_2 + 0x56c) = *(float *)(param_3 + 0x2c) - local_4c;
*(float *)(param_2 + 0x570) = fVar1 - local_48;
*(float *)(param_2 + 0x568) = fVar2 - local_50;
UTIL_Remove(param_1);
puVar10 = (undefined4 *)(**(code **)(*(int *)pCVar8 + 0xc))(pCVar8,pCVar12,uVar9);
*(undefined4 *)(param_3 + 0x10) = *puVar10;
(**(code **)(*(int *)pCVar8 + 0x298))(pCVar8);
GlobalEntity_SetMap(iVar5,*(undefined4 *)(gpGlobals + 0x3c));
cVar4 = DoRestoreEntity(this,pCVar8,(IRestore *)&local_44);
if (cVar4 != '\0') {
*(undefined4 *)(param_2 + 0x568) = 0;
uVar9 = 1;
*(undefined4 *)(param_2 + 0x56c) = 0;
*(undefined4 *)(param_2 + 0x570) = 0;
goto LAB_004abb39;
}
*(undefined4 *)(param_2 + 0x568) = 0;
*(undefined4 *)(param_2 + 0x56c) = 0;
*(undefined4 *)(param_2 + 0x570) = 0;
}
}
else {
iVar7 = _V_stricmp((char *)(param_2 + 0x544),(char *)pCVar6);
if (iVar7 == 0) goto LAB_004aba44;
}
uVar9 = 0;
LAB_004abb39:
local_44 = &PTR_GetReadPos_00c1d008;
local_34 = 0;
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)local_40);
local_30 = local_40[0];
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)local_40);
return uVar9;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.