CDirectorItemManager::SaveRevisitableItemState
0x008a6300 · 1128 bytes · __thiscall
_ZN20CDirectorItemManager24SaveRevisitableItemStateEv
Decompiled
undefined (1 param)
/* CDirectorItemManager::SaveRevisitableItemState() */
void __thiscall CDirectorItemManager::SaveRevisitableItemState(CDirectorItemManager *this)
{
char *pcVar1;
int in_GS_OFFSET;
bool bVar2;
undefined4 local_d0 [2];
undefined4 local_c8;
undefined4 local_c4;
undefined4 local_c0;
undefined4 local_bc;
undefined4 local_b8;
RevisitPopulationInfo local_b4 [128];
undefined4 local_34;
undefined4 local_30;
undefined4 local_2c;
int local_28;
undefined4 local_24;
int local_20;
local_34 = 0;
local_30 = 0;
local_2c = 0;
local_28 = 0;
local_24 = 0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
pcVar1 = "";
if (*(char **)(gpGlobals + 0x3c) != (char *)0x0) {
pcVar1 = *(char **)(gpGlobals + 0x3c);
}
/* try { // try from 008a6373 to 008a6377 has its CatchHandler @ 008a676a */
V_strncpy((char *)local_b4,pcVar1,0x80);
bVar2 = *(int *)(director_debug_revisit._28_4_ + 0x30) != 0;
if (bVar2) {
DevMsg("REVISIT: Saving revisitable state\n");
}
pcVar1 = "weapon_pain_pills_spawn";
do {
local_c8 = 0;
local_c4 = 0;
local_c0 = 0;
local_bc = 0;
local_b8 = 0;
/* try { // try from 008a63fb to 008a6441 has its CatchHandler @ 008a67a2 */
FindExistingItems(this,pcVar1,(ItemRestoreInfo *)local_d0,0);
CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
::InsertBefore((CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
*)&local_34,local_28,(ItemRestoreInfo *)local_d0);
if (bVar2) {
DevMsg("REVISIT: Saving %d instances of item %s\n",local_bc,local_d0[0]);
}
pcVar1 = pcVar1 + 0x80;
local_bc = 0;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_b8 = local_c8;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
} while (pcVar1 != "20CDirectorItemManager");
pcVar1 = "models/props_junk/gascan001a.mdl";
do {
local_c8 = 0;
local_c4 = 0;
local_c0 = 0;
local_bc = 0;
local_b8 = 0;
/* try { // try from 008a64c7 to 008a650d has its CatchHandler @ 008a6795 */
FindExistingItems(this,pcVar1,(ItemRestoreInfo *)local_d0,1);
CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
::InsertBefore((CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
*)&local_34,local_28,(ItemRestoreInfo *)local_d0);
if (bVar2) {
DevMsg("REVISIT: Saving %d instances of prop_physics ( %s )\n",local_bc,local_d0[0]);
}
pcVar1 = pcVar1 + 0x80;
local_bc = 0;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_b8 = local_c8;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
} while (pcVar1 != "weapon_pain_pills_spawn");
local_c8 = 0;
local_c4 = 0;
local_c0 = 0;
local_bc = 0;
local_b8 = 0;
/* try { // try from 008a6592 to 008a65ce has its CatchHandler @ 008a6793 */
FindExistingItems(this,"weapon_spawn",(ItemRestoreInfo *)local_d0,2);
CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
::InsertBefore((CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
*)&local_34,local_28,(ItemRestoreInfo *)local_d0);
if (bVar2) {
DevMsg("REVISIT: Saving %d instances of weapon_spawn\n",local_bc);
}
local_bc = 0;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_b8 = local_c8;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_c8 = 0;
local_c4 = 0;
local_c0 = 0;
local_bc = 0;
local_b8 = 0;
/* try { // try from 008a6644 to 008a6684 has its CatchHandler @ 008a6787 */
FindExistingItems(this,"weapon_melee_spawn",(ItemRestoreInfo *)local_d0,3);
CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
::InsertBefore((CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
*)&local_34,local_28,(ItemRestoreInfo *)local_d0);
if (bVar2) {
DevMsg("REVISIT: Saving %d instances of weapon_melee_spawn\n",local_bc);
local_bc = 0;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_b8 = local_c8;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
/* try { // try from 008a66b9 to 008a6764 has its CatchHandler @ 008a676a */
DevMsg("REVISIT: Save complete, %d items saved\n",local_28);
}
else {
local_bc = 0;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
local_b8 = local_c8;
CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfoInstance,int> *)&local_c8);
}
CUtlVector<CDirectorItemManager::RevisitPopulationInfo,CUtlMemory<CDirectorItemManager::RevisitPopulationInfo,int>>
::InsertBefore((CUtlVector<CDirectorItemManager::RevisitPopulationInfo,CUtlMemory<CDirectorItemManager::RevisitPopulationInfo,int>>
*)(this + 0x408),0,local_b4);
CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
::RemoveAll((CUtlVector<CDirectorItemManager::ItemRestoreInfo,CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>>
*)&local_34);
CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int> *)&local_34);
local_24 = local_34;
CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int>::Purge
((CUtlMemory<CDirectorItemManager::ItemRestoreInfo,int> *)&local_34);
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
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.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.