L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)