CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity>>
0x008ac100 · 469 bytes · __thiscall
_ZN20CDirectorItemManager27CollectPropPhysicsLocationsI7CHandleI11CBaseEntityEEEvPKcP20EntityPopulationInfoIT_E
Decompiled
void (3 params)
/* void CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity> >(char const*,
EntityPopulationInfo<CHandle<CBaseEntity> >*) */
void __thiscall
CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity>>
(CDirectorItemManager *this,char *param_1,EntityPopulationInfo *param_2)
{
code *pcVar1;
int *piVar2;
char *pcVar3;
int iVar4;
undefined4 *puVar5;
int *piVar6;
int *piVar7;
int aiStack_64 [4];
char *local_54;
float local_50;
int local_4c [3];
char *local_40;
int local_3c;
int local_38;
int local_34;
int local_30;
int local_2c;
int local_28;
undefined4 local_24;
undefined4 local_20;
param_2[4] = (EntityPopulationInfo)0x1;
*(char **)param_2 = param_1;
param_2[0x30] = (EntityPopulationInfo)0x1;
*(undefined4 *)(param_2 + 0x28) = 0;
local_54 = "prop_physics";
aiStack_64[3] = 0;
piVar7 = aiStack_64 + 2;
do {
*piVar7 = (int)gEntList;
piVar7[-1] = 0x8ac150;
piVar2 = (int *)CGlobalEntityList::FindEntityByClassname
((CGlobalEntityList *)*piVar7,(CBaseEntity *)piVar7[1],
(char *)piVar7[2]);
if (piVar2 == (int *)0x0) {
piVar7[4] = (int)(this + 0x41c);
iVar4 = *(int *)(director_item_cluster_range._28_4_ + 0x2c);
piVar7[2] = 0;
piVar7[1] = (int)param_2;
piVar7[3] = iVar4;
*piVar7 = (int)this;
piVar7[-1] = 0x8ac263;
CollateEncounters<CHandle<CBaseEntity>>
((CDirectorItemManager *)*piVar7,(EntityPopulationInfo *)piVar7[1],
SUB41(piVar7[2],0),(float)piVar7[3],(CUtlVector *)piVar7[4]);
if (*(int *)(director_debug_scavenge_items._28_4_ + 0x30) != 0) {
iVar4 = *(int *)(param_2 + 0x14);
piVar7[2] = (int)param_1;
piVar7[3] = iVar4;
iVar4 = *(int *)(param_2 + 0x28);
*piVar7 = (int)"Collected %d total %s items in %d encounters \n";
piVar7[1] = iVar4;
piVar7[-1] = 0x8ac28d;
Msg();
}
return;
}
piVar6 = piVar7;
if ((*(byte *)(piVar2 + 0x53) & 1) == 0) {
iVar4 = *piVar2;
piVar7[1] = (int)piVar2;
*piVar7 = (int)&local_40;
pcVar1 = *(code **)(iVar4 + 0x20);
piVar7[-1] = 0x8ac172;
(*pcVar1)();
pcVar3 = "";
if (local_40 != (char *)0x0) {
pcVar3 = local_40;
}
if (param_1 != pcVar3) {
*piVar7 = (int)pcVar3;
piVar7[-1] = (int)param_1;
piVar7[-2] = 0x8ac192;
iVar4 = _V_stricmp((char *)piVar7[-1],(char *)*piVar7);
piVar6 = piVar7 + -1;
if (iVar4 != 0) goto LAB_008ac138;
}
local_20 = 0xffffffff;
if ((*(byte *)((int)piVar2 + 0x14d) & 8) == 0) {
local_3c = piVar2[0xb8];
local_38 = piVar2[0xb9];
local_34 = piVar2[0xba];
}
else {
piVar7[-1] = (int)piVar2;
piVar7[-2] = 0x8ac2a0;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar7[-1]);
local_3c = piVar2[0xb8];
local_38 = piVar2[0xb9];
local_34 = piVar2[0xba];
if ((piVar2[0x53] & 0x800U) != 0) {
piVar7[-1] = (int)piVar2;
piVar7[-2] = 0x8ac2df;
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar7[-1]);
}
}
local_30 = piVar2[0xdf];
local_24 = 0;
local_2c = piVar2[0xe0];
local_28 = piVar2[0xe1];
iVar4 = *piVar2;
piVar7[-1] = (int)piVar2;
pcVar1 = *(code **)(iVar4 + 0xc);
piVar7[-2] = 0x8ac207;
puVar5 = (undefined4 *)(*pcVar1)();
local_20 = *puVar5;
piVar7[1] = (int)&local_3c;
*piVar7 = *(undefined4 *)(param_2 + 0x28);
piVar7[-1] = (int)(param_2 + 0x1c);
piVar7[-2] = 0x8ac225;
CUtlVector<EntityLocationInfo<CHandle<CBaseEntity>>,CUtlMemory<EntityLocationInfo<CHandle<CBaseEntity>>,int>>
::InsertBefore((CUtlVector<EntityLocationInfo<CHandle<CBaseEntity>>,CUtlMemory<EntityLocationInfo<CHandle<CBaseEntity>>,int>>
*)piVar7[-1],*piVar7,(EntityLocationInfo *)piVar7[1]);
piVar6 = piVar7 + -1;
}
LAB_008ac138:
*(char **)((int)piVar6 + 8) = "prop_physics";
*(int **)((int)piVar6 + 4) = piVar2;
piVar7 = piVar6;
} while( true );
}
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.