PlayerSaveData::PlayerSaveData
0x008f95b0 · 4345 bytes · __thiscall
_ZN14PlayerSaveDataC2EP13CTerrorPlayerPKc
Decompiled
undefined (3 params)
/* PlayerSaveData::PlayerSaveData(CTerrorPlayer*, char const*) */
void __thiscall
PlayerSaveData::PlayerSaveData(PlayerSaveData *this,CTerrorPlayer *param_1,char *param_2)
{
float fVar1;
CTerrorPlayer CVar2;
byte bVar3;
code *pcVar4;
char cVar5;
KeyValues *this_00;
int iVar6;
char *pcVar7;
uint uVar8;
int *piVar9;
int iVar10;
void *pvVar11;
int iVar12;
undefined4 uVar13;
undefined4 uVar14;
undefined *puVar15;
int *piVar16;
longdouble lVar17;
float fVar18;
uint in_stack_ffffffb8;
ulonglong uVar19;
char *local_20;
piVar16 = (int *)&stack0xffffffb4;
this_00 = KeyValues::operator_new((KeyValues *)0x2c,in_stack_ffffffb8);
/* try { // try from 008f95ef to 008f95f3 has its CatchHandler @ 008fa6c6 */
KeyValues::KeyValues(this_00,param_2,(IKeyValuesSystem *)0x0,false);
*(KeyValues **)this = this_00;
iVar6 = (**(code **)(*engine + 0x40))();
KeyValues::SetInt(*(KeyValues **)this,"userID",iVar6);
iVar6 = CTerrorPlayer::GetPlayerReportID(param_1);
KeyValues::SetInt(*(KeyValues **)this,"reportid",iVar6);
KeyValues::SetInt(*(KeyValues **)this,"restoreState",0);
pcVar7 = (char *)(**(code **)(*(int *)param_1 + 0xb8))();
KeyValues::SetString(*(KeyValues **)this,"name",pcVar7);
if ((*(uint *)(param_1 + 0x150) & 0x100) == 0) {
pcVar7 = (char *)(**(code **)(*engine + 0xe0))();
}
KeyValues::SetString(*(KeyValues **)this,"idealName",pcVar7);
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
pcVar7 = (char *)UTIL_VarArgs("%f %f %f");
KeyValues::SetString(*(KeyValues **)this,"pos",pcVar7);
if (((byte)param_1[0x14d] & 0x10) != 0) {
CBaseEntity::CalcAbsoluteVelocity((CBaseEntity *)param_1);
}
pcVar7 = (char *)UTIL_VarArgs("%f %f %f");
KeyValues::SetString(*(KeyValues **)this,"vel",pcVar7);
if (((byte)param_1[0x14d] & 8) != 0) {
CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
}
(**(code **)(*(int *)param_1 + 0x238))();
pcVar7 = (char *)UTIL_VarArgs("%f %f %f");
KeyValues::SetString(*(KeyValues **)this,"angles",pcVar7);
KeyValues::SetInt(*(KeyValues **)this,"positionFixedUp",0);
uVar19 = CONCAT44(*(uint *)(param_1 + 0x150) >> 1,"duckedFlag") & 0x1ffffffff;
KeyValues::SetInt(*(KeyValues **)this,(char *)uVar19,(int)(uVar19 >> 0x20));
KeyValues::SetInt(*(KeyValues **)this,"ducked",(uint)(byte)param_1[0x1a90]);
KeyValues::SetInt(*(KeyValues **)this,"ducking",(uint)(byte)param_1[0x1a91]);
cVar5 = CDirector::IsInTransition(TheDirector);
if ((cVar5 == '\0') || (cVar5 = CDirector::IsTransitionScenarioRestart(), cVar5 == '\0')) {
iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
KeyValues::SetInt(*(KeyValues **)this,"teamNumber",iVar6);
iVar6 = CCSPlayer::PlayerClass((CCSPlayer *)param_1);
KeyValues::SetInt(*(KeyValues **)this,"playerClass",iVar6);
KeyValues::SetInt(*(KeyValues **)this,"skin",*(int *)(param_1 + 0x458));
(**(code **)(*(int *)param_1 + 0x544))();
pcVar7 = (char *)ZombieClassName();
KeyValues::SetString(*(KeyValues **)this,"zombieClass",pcVar7);
(**(code **)(*(int *)param_1 + 0x20))();
piVar16 = (int *)&stack0xffffffb0;
pcVar7 = "";
if (local_20 != (char *)0x0) {
pcVar7 = local_20;
}
KeyValues::SetString(*(KeyValues **)this,"modelName",pcVar7);
KeyValues::GetString(*(KeyValues **)this,"modelName","");
KeyValues::GetString(*(KeyValues **)this,"idealName","");
UTIL_LogPrintf("(SKIN) %s saved model [%s] via PlayerSaveData\n");
KeyValues::SetInt(*(KeyValues **)this,"state",*(int *)(param_1 + 0x23bc));
KeyValues::SetInt(*(KeyValues **)this,"health",*(int *)(param_1 + 0x100));
lVar17 = (longdouble)(**(code **)(*(int *)param_1 + 0x7e4))();
KeyValues::SetFloat(*(KeyValues **)this,"healthBuffer",(float)lVar17);
KeyValues::SetInt(*(KeyValues **)this,"fumes",(uint)(byte)param_1[0x32fc]);
iVar6 = (**(code **)(*(int *)param_1 + 0x5f4))();
KeyValues::SetInt(*(KeyValues **)this,"flashlight",(uint)(iVar6 != 0));
uVar8 = (**(code **)(*(int *)param_1 + 0x7e8))();
KeyValues::SetInt(*(KeyValues **)this,"incapacitated",uVar8 & 0xff);
}
else {
iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
KeyValues::SetInt(*(KeyValues **)this,"teamNumber",iVar6);
KeyValues::SetInt(*(KeyValues **)this,"playerClass",0);
iVar6 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_1);
cVar5 = IsASurvivorTeam(iVar6);
if (cVar5 != '\0') {
(**(code **)(*(int *)param_1 + 0x20))();
piVar16 = (int *)&stack0xffffffb0;
}
piVar16[1] = (int)"modelName";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa312;
KeyValues::SetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
*piVar16 = 9;
piVar16[-1] = 0x8fa31e;
uVar13 = ZombieClassName();
piVar16[1] = (int)"zombieClass";
piVar16[2] = uVar13;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa337;
KeyValues::SetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
uVar13 = *(undefined4 *)(param_1 + 0x458);
piVar16[1] = (int)"skin";
piVar16[2] = uVar13;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa356;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[2] = (int)&DAT_00d539c2;
piVar16[1] = (int)"modelName";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa370;
uVar13 = KeyValues::GetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
piVar16[2] = (int)&DAT_00d539c2;
piVar16[1] = (int)"idealName";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa38c;
uVar14 = KeyValues::GetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
piVar16[2] = uVar13;
piVar16[1] = uVar14;
*piVar16 = (int)"(SKIN) %s saved model [%s] via PlayerSaveData\n";
piVar16[-1] = 0x8fa3a0;
UTIL_LogPrintf((char *)*piVar16);
piVar16[2] = 6;
piVar16[1] = (int)"state";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa3ba;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[2] = 1;
piVar16[1] = (int)"health";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa3d4;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[2] = 0;
piVar16[1] = (int)"healthBuffer";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa3ee;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
piVar16[2] = 0;
piVar16[1] = (int)"fumes";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa408;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[2] = 0;
piVar16[1] = (int)"flashlight";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa422;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[2] = 0;
piVar16[1] = (int)"incapacitated";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa43c;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
}
iVar6 = *(int *)(param_1 + 0x2ba0);
piVar16[1] = (int)"character";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9ab5;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[-1] = 0x8f9aba;
iVar6 = CTerrorGameRules::GetSurvivorSet();
piVar16[1] = (int)"survivorSet";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9ad0;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
CVar2 = param_1[0x3377];
piVar16[1] = (int)"hasUsedFlashlight";
piVar16[2] = (uint)(byte)CVar2;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9aed;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x1f5c);
piVar16[1] = (int)"kills";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b09;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x1f60);
piVar16[1] = (int)"deaths";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b25;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x307c);
piVar16[1] = (int)"survivorKills";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b41;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x30c0);
piVar16[1] = (int)"score";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b5d;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x2e54);
piVar16[1] = (int)"currentReviveCount";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b79;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
CVar2 = param_1[0x2e58];
piVar16[1] = (int)"thirdStrike";
piVar16[2] = (uint)(byte)CVar2;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9b96;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x2e5c);
piVar16[1] = (int)"missionReviveCount";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9bb2;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
*piVar16 = (int)param_1;
piVar16[-1] = 0x8f9bba;
uVar8 = CTerrorPlayer::WantsToPlay((CTerrorPlayer *)*piVar16);
piVar16[1] = (int)"wantsToPlay";
piVar16[2] = uVar8 & 0xff;
iVar6 = 1;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9bd8;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
do {
piVar16[1] = iVar6;
*piVar16 = (int)param_1;
piVar16[-1] = 0x8f9bef;
piVar9 = (int *)CTerrorPlayer::GetTerrorWeapon();
if (piVar9 != (int *)0x0) {
iVar10 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar10 + 0x530);
piVar16[-1] = 0x8f9c04;
iVar10 = (*pcVar4)();
if (iVar10 == 3) {
piVar16[3] = 0;
piVar16[2] = (int)&CBaseBackpackItem::typeinfo;
piVar16[1] = (int)&CTerrorWeapon::typeinfo;
*piVar16 = (int)piVar9;
piVar16[-1] = 0x8f9c29;
iVar10 = __dynamic_cast();
if ((iVar10 != 0) && (*(char *)(iVar10 + 0x17dc) != '\0')) goto LAB_008f9dc7;
}
*piVar16 = 0x2c;
piVar16[-1] = 0x8f9c46;
pvVar11 = KeyValues::operator_new((KeyValues *)*piVar16,piVar16[1]);
piVar16[3] = 0;
piVar16[2] = 0;
piVar16[1] = (int)"weapon";
*piVar16 = (int)pvVar11;
/* try { // try from 008f9c63 to 008f9c67 has its CatchHandler @ 008fa6b4 */
piVar16[-1] = 0x8f9c68;
KeyValues::KeyValues
((KeyValues *)*piVar16,(char *)piVar16[1],(IKeyValuesSystem *)piVar16[2],
SUB41(piVar16[3],0));
piVar16[1] = (int)pvVar11;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9c79;
KeyValues::AddSubKey((KeyValues *)*piVar16,(KeyValues *)piVar16[1]);
piVar16[2] = iVar6;
piVar16[1] = (int)"weaponID";
*piVar16 = (int)pvVar11;
piVar16[-1] = 0x8f9c8d;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar10 = piVar9[0x116];
*piVar16 = (int)pvVar11;
piVar16[1] = (int)"weaponskin";
piVar16[2] = iVar10;
piVar16[-1] = 0x8f9ca7;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
if (iVar6 == 0x13) {
piVar16[3] = 0;
piVar16[2] = (int)&CTerrorMeleeWeapon::typeinfo;
piVar16[1] = (int)&CBaseCombatWeapon::typeinfo;
*piVar16 = (int)piVar9;
piVar16[-1] = 0x8fa218;
iVar10 = __dynamic_cast();
if (iVar10 != 0) {
*piVar16 = iVar10;
piVar16[-1] = 0x8fa228;
iVar10 = CTerrorMeleeWeapon::GetMeleeWeaponInfo((CTerrorMeleeWeapon *)*piVar16);
if (iVar10 != 0) {
piVar16[2] = 1;
piVar16[1] = (int)"meleeWeapon";
*piVar16 = (int)pvVar11;
piVar16[-1] = 0x8fa24b;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
piVar16[1] = (int)"meleeWeaponName";
*piVar16 = (int)pvVar11;
piVar16[2] = iVar10 + 0xc50;
piVar16[-1] = 0x8fa267;
KeyValues::SetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
}
}
}
iVar10 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar10 + 0x530);
piVar16[-1] = 0x8f9cbb;
iVar10 = (*pcVar4)();
piVar16[1] = (int)"weaponSlot";
piVar16[2] = iVar10;
*piVar16 = (int)pvVar11;
piVar16[-1] = 0x8f9ccf;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar10 = piVar9[0x508];
*piVar16 = (int)pvVar11;
piVar16[1] = (int)"currentMagazine";
piVar16[2] = iVar10;
piVar16[-1] = 0x8f9ce9;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar10 = 0;
do {
iVar12 = *piVar9;
piVar16[1] = iVar10;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar12 + 0x6b4);
piVar16[-1] = 0x8f9d01;
cVar5 = (*pcVar4)();
if (cVar5 != '\0') {
*piVar16 = iVar10;
piVar16[-1] = 0x8fa1c8;
iVar12 = UpgradeToString();
*piVar16 = (int)"UPGRADE_%s";
piVar16[1] = iVar12;
piVar16[-1] = 0x8fa1d8;
iVar12 = UTIL_VarArgs((char *)*piVar16);
piVar16[2] = 1;
piVar16[1] = iVar12;
*piVar16 = (int)pvVar11;
piVar16[-1] = 0x8fa1ec;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
}
iVar10 = iVar10 + 1;
} while (iVar10 != 3);
bVar3 = *(byte *)(piVar9 + 0x5e4);
piVar16[1] = (int)"upgradedAmmoCount";
*piVar16 = (int)pvVar11;
piVar16[2] = (uint)bVar3;
piVar16[-1] = 0x8f9d31;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar10 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar10 + 0x55c);
piVar16[-1] = 0x8f9d3c;
iVar10 = (*pcVar4)();
iVar12 = 0;
if (iVar10 != -1) {
*piVar16 = (int)piVar9;
piVar16[-1] = 0x8f9d50;
uVar13 = CTerrorWeapon::GetPlayerOwner((CTerrorWeapon *)*piVar16);
*piVar16 = uVar13;
piVar16[1] = iVar10;
piVar16[-1] = 0x8f9d5f;
iVar12 = CBaseCombatCharacter::GetAmmoCount((CBaseCombatCharacter *)*piVar16,piVar16[1]);
}
piVar16[2] = iVar12;
piVar16[1] = (int)"extraAmmo";
*piVar16 = (int)pvVar11;
piVar16[-1] = 0x8f9d73;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar10 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar10 + 0x500);
piVar16[-1] = 0x8f9d7e;
piVar9 = (int *)(*pcVar4)();
if (piVar9 != (int *)0x0) {
iVar10 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar10 + 0x674);
piVar16[-1] = 0x8f9d8f;
uVar8 = (*pcVar4)();
piVar16[1] = (int)"dual";
*piVar16 = (int)pvVar11;
piVar16[2] = uVar8 & 0xff;
piVar16[-1] = 0x8f9da6;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
bVar3 = *(byte *)((int)piVar9 + 0x17e2);
*piVar16 = (int)pvVar11;
piVar16[1] = (int)"reloaded";
piVar16[2] = (uint)(bVar3 ^ 1);
piVar16[-1] = 0x8f9dc7;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
}
}
LAB_008f9dc7:
iVar6 = iVar6 + 1;
} while (iVar6 != 0x38);
*piVar16 = (int)param_1;
piVar16[-1] = 0x8f9dde;
piVar9 = (int *)CCSPlayer::GetActiveCSWeapon((CCSPlayer *)*piVar16);
if (piVar9 == (int *)0x0) {
*piVar16 = 0;
}
else {
iVar6 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar6 + 0x638);
piVar16[-1] = 0x8f9df1;
uVar13 = (*pcVar4)();
*piVar16 = uVar13;
}
piVar16[-1] = 0x8f9df9;
iVar6 = WeaponIDToAlias(*piVar16);
piVar16[1] = (int)"activeWeapon";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9e12;
KeyValues::SetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
iVar6 = *(int *)(param_1 + 0x3f90);
piVar16[1] = (int)"lastPrimaryWeaponId";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9e34;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x3f94);
piVar16[1] = (int)"lastPrimaryWeaponAmmo";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9e50;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x3f98);
piVar16[1] = (int)"lastSecondaryWeaponId";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9e6c;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
CVar2 = param_1[0x3f9c];
piVar16[1] = (int)"lastHadElites";
piVar16[2] = (uint)(byte)CVar2;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9e89;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
uVar8 = *(uint *)(param_1 + 0x3fa0);
if ((((uVar8 != 0xffffffff) &&
(puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar15 + 8) == uVar8 >> 0xc)) &&
(piVar9 = *(int **)(puVar15 + 4), piVar9 != (int *)0x0)) {
iVar6 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar6 + 0x638);
piVar16[-1] = 0x8fa5e2;
iVar10 = (*pcVar4)();
*piVar16 = iVar10;
piVar16[-1] = 0x8fa5ec;
iVar6 = WeaponIDToClassname();
if (((iVar10 == 0x13) && (uVar8 = *(uint *)(param_1 + 0x3fa0), uVar8 != 0xffffffff)) &&
((puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc &&
((*(uint *)(puVar15 + 8) == uVar8 >> 0xc && (iVar10 = *(int *)(puVar15 + 4), iVar10 != 0))))
)) {
piVar16[3] = 0;
piVar16[2] = (int)&CTerrorMeleeWeapon::typeinfo;
piVar16[1] = (int)&CBaseCombatWeapon::typeinfo;
*piVar16 = iVar10;
piVar16[-1] = 0x8fa675;
iVar10 = __dynamic_cast();
if (iVar10 != 0) {
*piVar16 = iVar10;
piVar16[-1] = 0x8fa685;
iVar6 = CTerrorMeleeWeapon::GetMeleeWeaponInfo((CTerrorMeleeWeapon *)*piVar16);
iVar6 = iVar6 + 0xc50;
}
}
piVar16[2] = iVar6;
piVar16[1] = (int)"restoreSecondaryWeaponName";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa60c;
KeyValues::SetString((KeyValues *)*piVar16,(char *)piVar16[1],(char *)piVar16[2]);
}
iVar6 = 0;
do {
fVar18 = *(float *)(gpGlobals + 0xc);
fVar1 = *(float *)(param_1 + iVar6 * 4 + 0x2cf0);
*piVar16 = iVar6;
piVar16[-1] = 0x8f9ef3;
iVar10 = ZombieClassName();
piVar16[2] = (int)"timestamp";
piVar16[1] = iVar10;
*piVar16 = (int)"%s_%s";
piVar16[-1] = 0x8f9f0b;
iVar10 = UTIL_VarArgs((char *)*piVar16);
piVar16[1] = iVar10;
piVar16[2] = (int)(fVar18 - fVar1);
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9f24;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
iVar10 = *(int *)(param_1 + iVar6 * 4 + 0x2d14);
*piVar16 = iVar6;
iVar6 = iVar6 + 1;
piVar16[-1] = 0x8f9f35;
iVar12 = ZombieClassName();
piVar16[2] = (int)"spawns";
piVar16[1] = iVar12;
*piVar16 = (int)"%s_%s";
piVar16[-1] = 0x8f9f4d;
iVar12 = UTIL_VarArgs((char *)*piVar16);
piVar16[2] = iVar10;
piVar16[1] = iVar12;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9f5f;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
} while (iVar6 != 9);
iVar6 = *(int *)(param_1 + 0x2d4c);
piVar16[1] = (int)"minDeadDuration";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9f8e;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
iVar6 = *(int *)(param_1 + 0x2d50);
piVar16[1] = (int)"maxDeadDuration";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9fae;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
iVar6 = *(int *)(param_1 + 0x2d54);
piVar16[1] = (int)"totalDeadDuration";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9fce;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
iVar6 = *(int *)(param_1 + 0x2d58);
piVar16[1] = (int)"deadCount";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8f9fea;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
uVar8 = *(uint *)(param_1 + 0x30bc);
if ((((uVar8 != 0xffffffff) &&
(puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar15 + 8) == uVar8 >> 0xc)) &&
(piVar9 = *(int **)(puVar15 + 4), piVar9 != (int *)0x0)) {
iVar6 = *piVar9;
*piVar16 = (int)piVar9;
iVar10 = 0;
pcVar4 = *(code **)(iVar6 + 0x344);
piVar16[-1] = 0x8fa486;
lVar17 = (longdouble)(*pcVar4)();
uVar8 = *(uint *)(param_1 + 0x30bc);
if (((uVar8 != 0xffffffff) &&
(puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar15 + 8) == uVar8 >> 0xc)) {
iVar10 = *(int *)(puVar15 + 4);
}
fVar18 = 0.0;
if (0.0 < *(float *)(iVar10 + 0x458)) {
fVar18 = *(float *)(iVar10 + 0x454);
}
if (((0.0 < (float)lVar17) && ((float)lVar17 < 60.0)) && ((0.0 < fVar18 && (fVar18 < 60.0)))) {
piVar9 = (int *)0x0;
if (((uVar8 != 0xffffffff) &&
(puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar15 + 8) == uVar8 >> 0xc)) {
piVar9 = *(int **)(puVar15 + 4);
}
iVar6 = *piVar9;
*piVar16 = (int)piVar9;
pcVar4 = *(code **)(iVar6 + 0x344);
piVar16[-1] = 0x8fa53e;
lVar17 = (longdouble)(*pcVar4)();
piVar16[1] = (int)"abilityTimerTime";
piVar16[2] = (int)(float)lVar17;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa561;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
iVar10 = 0;
iVar6 = 0;
uVar8 = *(uint *)(param_1 + 0x30bc);
if (((uVar8 != 0xffffffff) &&
(puVar15 = g_pEntityList + (uVar8 & 0xfff) * 0x10, puVar15 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar15 + 8) == uVar8 >> 0xc)) {
iVar10 = *(int *)(puVar15 + 4);
}
if (0.0 < *(float *)(iVar10 + 0x458)) {
iVar6 = *(int *)(iVar10 + 0x454);
}
piVar16[2] = iVar6;
piVar16[1] = (int)"abilityTimerDuration";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa5c7;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
goto LAB_008fa052;
}
}
piVar16[2] = 0;
piVar16[1] = (int)"abilityTimerTime";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa038;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
piVar16[2] = 0;
piVar16[1] = (int)"abilityTimerDuration";
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa052;
KeyValues::SetFloat((KeyValues *)*piVar16,(char *)piVar16[1],(float)piVar16[2]);
LAB_008fa052:
iVar6 = 0;
do {
iVar10 = *(int *)(param_1 + iVar6 * 4 + 0x38dc);
*piVar16 = iVar6;
iVar6 = iVar6 + 1;
piVar16[-1] = 0x8fa079;
iVar12 = ZombieClassName();
piVar16[2] = (int)"missionZombieKills";
piVar16[1] = iVar12;
*piVar16 = (int)"%s_%s";
piVar16[-1] = 0x8fa091;
iVar12 = UTIL_VarArgs((char *)*piVar16);
piVar16[2] = iVar10;
piVar16[1] = iVar12;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa0a3;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
} while (iVar6 != 9);
iVar6 = 0;
do {
while (iVar10 = *(int *)(param_1 + iVar6 * 4 + 0x3664), iVar10 != 0) {
piVar16[1] = iVar6;
iVar6 = iVar6 + 1;
*piVar16 = (int)"award_%d";
piVar16[-1] = 0x8fa0dd;
iVar12 = UTIL_VarArgs((char *)*piVar16);
piVar16[2] = iVar10;
piVar16[1] = iVar12;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa0f2;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
if (iVar6 == 0x95) goto LAB_008fa0fa;
}
iVar6 = iVar6 + 1;
} while (iVar6 != 0x95);
LAB_008fa0fa:
iVar6 = *(int *)(param_1 + 0x3088);
piVar16[1] = (int)"tankTickets";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa11c;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x3084);
piVar16[1] = (int)"missionSurvivorDamage";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa138;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
if (*(int *)(param_1 + 0x3110) != 0) {
bVar3 = *(byte *)(*(int *)(param_1 + 0x3110) + 0x120);
piVar16[1] = (int)"hasSaidScenarioJoin";
piVar16[2] = (uint)bVar3;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa15f;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
}
iVar6 = *(int *)(param_1 + 0x3a88);
piVar16[1] = (int)"missionIDSpawnedOn";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa181;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
iVar6 = *(int *)(param_1 + 0x3a8c);
piVar16[1] = (int)"teamSpawnedOn";
piVar16[2] = iVar6;
*piVar16 = *(undefined4 *)this;
piVar16[-1] = 0x8fa19d;
KeyValues::SetInt((KeyValues *)*piVar16,(char *)piVar16[1],piVar16[2]);
KeyValues::SetInt(*(KeyValues **)this,"idle",(uint)(byte)param_1[0x3fcc]);
return;
}
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.