L L4D2node

CTerrorGameRules::PopulateDeathEvent

0x00503040 · 1877 bytes · __thiscall

_ZN16CTerrorGameRules18PopulateDeathEventEP9KeyValuesPK11CBaseEntityPK20CBaseCombatCharacterRK15CTakeDamageInfo

Decompiled

undefined (5 params)

/* CTerrorGameRules::PopulateDeathEvent(KeyValues*, CBaseEntity const*, CBaseCombatCharacter const*,
   CTakeDamageInfo const&) */

void __thiscall
CTerrorGameRules::PopulateDeathEvent
          (CTerrorGameRules *this,KeyValues *param_1,CBaseEntity *param_2,
          CBaseCombatCharacter *param_3,CTakeDamageInfo *param_4)

{
  char cVar1;
  int iVar2;
  int *piVar3;
  float *pfVar4;
  uint uVar5;
  undefined4 uVar6;
  undefined *puVar7;
  char *pcVar8;
  CBaseEntity *this_00;
  CBaseCombatCharacter *pCVar9;
  char *pcVar10;
  char *pcVar11;
  undefined1 uVar12;
  undefined1 uVar13;
  bool bVar14;
  byte bVar15;
  byte local_35;
  CBaseCombatCharacter *local_34;
  CBaseEntity *local_2c;
  CBaseCombatCharacter *local_28;
  
  bVar15 = 0;
  local_28 = param_3;
  if ((param_2 == (CBaseEntity *)0x0) ||
     (cVar1 = (**(code **)(*(int *)param_2 + 0x16c))(param_2), cVar1 == '\0')) {
    local_2c = (CBaseEntity *)0x0;
  }
  else {
    local_2c = param_2;
  }
  if ((param_3 == (CBaseCombatCharacter *)0x0) ||
     (cVar1 = (**(code **)(*(int *)param_3 + 0x16c))(param_3), cVar1 == '\0')) {
    local_28 = (CBaseCombatCharacter *)0x0;
  }
  pCVar9 = (CBaseCombatCharacter *)0x0;
  uVar5 = *(uint *)(param_4 + 0x30);
  if (((uVar5 != 0xffffffff) &&
      (puVar7 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar7 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar7 + 8) == uVar5 >> 0xc)) {
    pCVar9 = *(CBaseCombatCharacter **)(puVar7 + 4);
  }
  uVar5 = *(uint *)(param_4 + 0x34);
  if (uVar5 == 0xffffffff) {
    return;
  }
  puVar7 = g_pEntityList + (uVar5 & 0xfff) * 0x10;
  if (puVar7 == (undefined *)0xfffffffc) {
    return;
  }
  if (*(uint *)(puVar7 + 8) != uVar5 >> 0xc) {
    return;
  }
  local_34 = *(CBaseCombatCharacter **)(puVar7 + 4);
  if (local_34 == (CBaseCombatCharacter *)0x0) {
    return;
  }
  iVar2 = (**(code **)(*(int *)local_34 + 0x100))(local_34);
  if (iVar2 == 1) {
    iVar2 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(local_34 + 0x30));
    KeyValues::SetInt(param_1,"attacker",iVar2);
    local_35 = (byte)((uint)*(undefined4 *)(param_4 + 0x48) >> 0x1e) & 1;
    if (pCVar9 == (CBaseCombatCharacter *)0x0) {
LAB_00503800:
      pcVar8 = "world";
    }
    else {
      if (pCVar9 == local_34) {
        iVar2 = CBaseCombatCharacter::GetActiveWeapon(local_34);
        if (iVar2 == 0) goto LAB_00503800;
        iVar2 = CBaseCombatCharacter::GetActiveWeapon(local_34);
        pcVar8 = *(char **)(iVar2 + 0x7c);
      }
      else {
        cVar1 = (**(code **)(*(int *)pCVar9 + 0x16c))(pCVar9);
        if (cVar1 != '\0') {
          cVar1 = (**(code **)(*(int *)pCVar9 + 0x16c))(pCVar9);
          this_00 = (CBaseEntity *)0x0;
          if (cVar1 != '\0') {
            this_00 = (CBaseEntity *)pCVar9;
          }
          iVar2 = CBaseEntity::GetTeamNumber(this_00);
          if ((iVar2 == 3) && (iVar2 = (**(code **)(*(int *)this_00 + 0x544))(this_00), iVar2 == 2))
          {
            pcVar8 = "boomer";
            goto LAB_00503639;
          }
        }
        pcVar8 = *(char **)(pCVar9 + 0x7c);
      }
      if (pcVar8 != (char *)0x0) {
        iVar2 = 7;
        uVar13 = false;
        pcVar10 = pcVar8;
        pcVar11 = "weapon_";
        do {
          if (iVar2 == 0) break;
          iVar2 = iVar2 + -1;
          uVar13 = *pcVar10 == *pcVar11;
          pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
          pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
        } while ((bool)uVar13);
        uVar12 = 0;
        goto joined_r0x0050327e;
      }
      pcVar8 = "";
    }
LAB_00503639:
    uVar12 = 1;
LAB_005031c0:
    iVar2 = 5;
    pcVar10 = pcVar8;
    pcVar11 = "func_";
    do {
      if (iVar2 == 0) break;
      iVar2 = iVar2 + -1;
      uVar12 = *pcVar10 == *pcVar11;
      pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
      pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
    } while ((bool)uVar12);
    if ((bool)uVar12) {
      pcVar8 = pcVar8 + 5;
      goto LAB_00503287;
    }
    iVar2 = 9;
    bVar14 = false;
    pcVar10 = pcVar8;
    pcVar11 = "pipe_bomb";
    do {
      if (iVar2 == 0) break;
      iVar2 = iVar2 + -1;
      bVar14 = *pcVar10 == *pcVar11;
      pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
      pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
    } while (bVar14);
    if (!bVar14) goto LAB_00503287;
    pcVar8 = "pipe_bomb";
LAB_0050328f:
    iVar2 = _V_stricmp(pcVar8,"pistol");
    if (iVar2 == 0) goto LAB_005032a9;
  }
  else {
    if (pCVar9 == (CBaseCombatCharacter *)0x0) {
      return;
    }
    pcVar8 = *(char **)(pCVar9 + 0x7c);
    if (pcVar8 == (char *)0x0) {
      pcVar8 = "";
    }
    KeyValues::SetInt(param_1,"attacker",0);
    if (*(int *)(local_34 + 0x30) == 0) {
      iVar2 = 0;
      uVar12 = true;
    }
    else {
      iVar2 = *(int *)(local_34 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
      uVar12 = iVar2 == 0;
    }
    KeyValues::SetInt(param_1,"attackerentid",iVar2);
    local_34 = (CBaseCombatCharacter *)0x0;
    local_35 = 0;
    iVar2 = 7;
    pcVar10 = pcVar8;
    pcVar11 = "weapon_";
    do {
      uVar13 = uVar12;
      if (iVar2 == 0) break;
      iVar2 = iVar2 + -1;
      uVar12 = *pcVar10 == *pcVar11;
      pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
      pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
      uVar13 = uVar12;
    } while ((bool)uVar12);
joined_r0x0050327e:
    if (!(bool)uVar13) goto LAB_005031c0;
    pcVar8 = pcVar8 + 7;
LAB_00503287:
    if (pcVar8 != "pistol") goto LAB_0050328f;
LAB_005032a9:
    if (((local_34 != (CBaseCombatCharacter *)0x0) &&
        (piVar3 = (int *)CTerrorPlayer::GetActiveTerrorWeapon((CTerrorPlayer *)local_34),
        piVar3 != (int *)0x0)) && (cVar1 = (**(code **)(*piVar3 + 0x674))(piVar3), cVar1 != '\0')) {
      pcVar8 = "dual_pistols";
    }
  }
  KeyValues::SetString(param_1,"weapon",pcVar8);
  if (local_35 == 0) {
    KeyValues::SetInt(param_1,"headshot",0);
    KeyValues::SetInt(param_1,"type",*(int *)(param_4 + 0x48));
    iVar2 = 7;
  }
  else {
    KeyValues::SetInt(param_1,"headshot",1);
    KeyValues::SetInt(param_1,"type",*(int *)(param_4 + 0x48));
    iVar2 = 8;
  }
  KeyValues::SetInt(param_1,"priority",iVar2);
  if (local_28 != (CBaseCombatCharacter *)0x0) {
    KeyValues::SetInt(param_1,"abort",(uint)(byte)local_28[0x3376]);
  }
  pfVar4 = (float *)(**(code **)(*(int *)param_3 + 0x288))(param_3);
  KeyValues::SetFloat(param_1,"victim_x",*pfVar4);
  iVar2 = (**(code **)(*(int *)param_3 + 0x288))(param_3);
  KeyValues::SetFloat(param_1,"victim_y",*(float *)(iVar2 + 4));
  iVar2 = (**(code **)(*(int *)param_3 + 0x288))(param_3);
  KeyValues::SetFloat(param_1,"victim_z",*(float *)(iVar2 + 8));
  KeyValues::SetString(param_1,"victimname","");
  uVar5 = 1;
  if (local_2c != (CBaseEntity *)0x0) {
    uVar5 = (**(code **)(*(int *)local_2c + 0x778))(local_2c);
    uVar5 = uVar5 & 0xff;
  }
  KeyValues::SetInt(param_1,"attackerisbot",uVar5);
  if ((param_2 == (CBaseEntity *)0x0) || (iVar2 = CBaseEntity::GetTeamNumber(param_2), iVar2 != 3))
  goto LAB_00503446;
  if (local_2c == (CBaseEntity *)0x0) {
    piVar3 = (int *)__dynamic_cast(param_2,&CBaseEntity::typeinfo,&Infected::typeinfo,0);
    if (piVar3 != (int *)0x0) {
      uVar6 = (**(code **)(*piVar3 + 0x544))(piVar3);
      goto LAB_005035d5;
    }
switchD_005035de_caseD_0:
    KeyValues::SetString(param_1,"attackername","Infected");
  }
  else {
    uVar6 = (**(code **)(*(int *)local_2c + 0x544))(local_2c);
LAB_005035d5:
    switch(uVar6) {
    default:
      goto switchD_005035de_caseD_0;
    case 1:
      KeyValues::SetString(param_1,"attackername","Smoker");
      break;
    case 2:
      KeyValues::SetString(param_1,"attackername","Boomer");
      break;
    case 3:
      KeyValues::SetString(param_1,"attackername","Hunter");
      break;
    case 4:
      KeyValues::SetString(param_1,"attackername","Spitter");
      break;
    case 5:
      KeyValues::SetString(param_1,"attackername","Jockey");
      break;
    case 6:
      KeyValues::SetString(param_1,"attackername","Charger");
      break;
    case 7:
      KeyValues::SetString(param_1,"attackername","Witch");
      break;
    case 8:
      KeyValues::SetString(param_1,"attackername","Tank");
    }
  }
LAB_00503446:
  iVar2 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_3);
  if (iVar2 != 3) {
    return;
  }
  if (local_28 == (CBaseCombatCharacter *)0x0) {
    KeyValues::SetInt(param_1,"victimisbot",1);
    piVar3 = (int *)__dynamic_cast(param_3,&CBaseCombatCharacter::typeinfo,&Infected::typeinfo,0);
    if (piVar3 != (int *)0x0) {
      uVar6 = (**(code **)(*piVar3 + 0x544))(piVar3);
      goto LAB_00503497;
    }
switchD_005034a0_caseD_0:
    param_2 = (CBaseEntity *)0xc7bdad;
  }
  else {
    uVar6 = (**(code **)(*(int *)local_28 + 0x544))(local_28);
    uVar5 = (**(code **)(*(int *)local_28 + 0x778))(local_28);
    KeyValues::SetInt(param_1,"victimisbot",uVar5 & 0xff);
LAB_00503497:
    switch(uVar6) {
    default:
      goto switchD_005034a0_caseD_0;
    case 1:
      param_2 = (CBaseEntity *)0xd340d3;
      break;
    case 2:
      param_2 = (CBaseEntity *)0xd00ab8;
      break;
    case 3:
      param_2 = (CBaseEntity *)0xd30013;
      break;
    case 4:
      param_2 = (CBaseEntity *)0xd36293;
      break;
    case 5:
      param_2 = (CBaseEntity *)0xd320f3;
      break;
    case 6:
      param_2 = (CBaseEntity *)0xd2ddc3;
      break;
    case 7:
      param_2 = (CBaseEntity *)0xd27028;
      break;
    case 8:
      param_2 = (CBaseEntity *)0xcfb55e;
    }
  }
  KeyValues::SetString(param_1,"victimname",(char *)param_2);
  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)