L L4D2node

Infected::SetAlertBodyGroupVariant

0x00a149b0 · 798 bytes · __thiscall

_ZN8Infected24SetAlertBodyGroupVariantEPKcS1_

Decompiled

undefined (3 params)

/* WARNING: Type propagation algorithm not settling */
/* Infected::SetAlertBodyGroupVariant(char const*, char const*) */

uint __thiscall Infected::SetAlertBodyGroupVariant(Infected *this,char *param_1,char *param_2)

{
  int iVar1;
  int *piVar2;
  char cVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  char *pcVar7;
  size_t sVar8;
  size_t sVar9;
  int iVar10;
  undefined4 *puVar11;
  int *piVar12;
  int in_GS_OFFSET;
  bool bVar13;
  undefined1 local_45;
  int local_44;
  int local_40 [12];
  
  piVar12 = (int *)&stack0xffffff84;
  local_40[8] = *(int *)(in_GS_OFFSET + 0x14);
  if (*(int *)(ZombieExpressions._28_4_ + 0x30) == 0) {
    iVar4 = CBaseAnimating::FindBodygroupByName((CBaseAnimating *)this,param_1);
    if ((-1 < iVar4) &&
       (iVar6 = CBaseAnimating::GetNumBodyGroups((CBaseAnimating *)this), iVar4 < iVar6)) {
      iVar6 = CBaseAnimating::GetBodygroup((CBaseAnimating *)this,iVar4);
      pcVar7 = (char *)CBaseAnimating::GetBodygroupPartName((CBaseAnimating *)this,iVar4,iVar6);
      if (1 < (byte)(*pcVar7 + 0xbcU)) {
        local_45 = 0x58;
        local_44 = -1;
        iVar6 = sscanf(pcVar7,"%c%d");
        if (iVar6 == 2) {
          sVar8 = strlen(param_2);
          local_40[3] = 0;
          local_40[4] = 0;
          local_40[5] = 0;
          local_40[6] = 0;
          local_40[7] = 0;
                    /* try { // try from 00a14b84 to 00a14cdd has its CatchHandler @ 00a14cea */
          iVar6 = CBaseAnimating::GetBodygroupCount((CBaseAnimating *)this,iVar4);
          piVar2 = local_40 + 3;
          local_40[0] = 0;
          puVar11 = (undefined4 *)&stack0xffffff84;
          if (0 < iVar6) {
            do {
              puVar11[2] = local_40[0];
              puVar11[1] = iVar4;
              *puVar11 = this;
              puVar11[-1] = 0xa14bd2;
              pcVar7 = (char *)CBaseAnimating::GetBodygroupPartName
                                         ((CBaseAnimating *)*puVar11,puVar11[1],puVar11[2]);
              *puVar11 = pcVar7;
              local_40[1] = 0xffffffff;
              local_40[2] = -1;
              puVar11[-1] = 0xa14bea;
              sVar9 = strlen((char *)*puVar11);
              iVar1 = -((sVar9 + 0x10 & 0xfffffff0) + 0x10);
              piVar12 = (int *)((int)puVar11 + iVar1);
              *(char **)((int)puVar11 + iVar1 + 4) = "E%d_%c%d_%s";
              *(int **)((int)puVar11 + iVar1 + 0x10) = local_40 + 2;
              uVar5 = (int)puVar11 + iVar1 + 0x27 & 0xfffffff0;
              *(char **)((int)puVar11 + iVar1) = pcVar7;
              *(undefined1 **)((int)puVar11 + iVar1 + 0xc) = &local_45;
              *(uint *)((int)puVar11 + iVar1 + 0x14) = uVar5;
              *(int **)((int)puVar11 + iVar1 + 8) = local_40 + 1;
              *(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c28;
              iVar10 = sscanf(*(char **)((int)puVar11 + iVar1),*(char **)((int)puVar11 + iVar1 + 4))
              ;
              if (((iVar10 == 4) && (*pcVar7 == 'E')) && (local_44 == local_40[2])) {
                *(uint *)((int)puVar11 + iVar1) = uVar5;
                *(size_t *)((int)puVar11 + iVar1 + 8) = sVar8;
                *(char **)((int)puVar11 + iVar1 + 4) = param_2;
                *(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c5b;
                iVar10 = V_strnicmp(*(char **)((int)puVar11 + iVar1),
                                    *(char **)((int)puVar11 + iVar1 + 4),
                                    *(int *)((int)puVar11 + iVar1 + 8));
                if (iVar10 == 0) {
                  *(int **)((int)puVar11 + iVar1 + 8) = local_40;
                  *(int *)((int)puVar11 + iVar1 + 4) = local_40[6];
                  *(int **)((int)puVar11 + iVar1) = piVar2;
                  *(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c7c;
                  CUtlVector<int,CUtlMemory<int,int>>::InsertBefore
                            (*(CUtlVector<int,CUtlMemory<int,int>> **)((int)puVar11 + iVar1),
                             *(int *)((int)puVar11 + iVar1 + 4),*(int **)((int)puVar11 + iVar1 + 8))
                  ;
                }
              }
              local_40[0] = local_40[0] + 1;
              puVar11 = (undefined4 *)((int)puVar11 + iVar1);
            } while (local_40[0] < iVar6);
          }
          bVar13 = local_40[6] != 0;
          if (bVar13) {
            iVar6 = local_40[6] + -1;
            *piVar12 = 0;
            piVar12[1] = iVar6;
            piVar12[-1] = 0xa14cc8;
            iVar6 = RandomInt();
            iVar6 = *(int *)(local_40[3] + iVar6 * 4);
            piVar12[1] = iVar4;
            *piVar12 = (int)this;
            piVar12[2] = iVar6;
            piVar12[-1] = 0xa14cde;
            CBaseAnimating::SetBodygroup((CBaseAnimating *)*piVar12,piVar12[1],piVar12[2]);
          }
          uVar5 = (uint)bVar13;
          local_40[6] = 0;
          *piVar12 = (int)piVar2;
          piVar12[-1] = 0xa14c9f;
          CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)*piVar12);
          iVar4 = local_40[3];
          *piVar12 = (int)piVar2;
          local_40[7] = iVar4;
          piVar12[-1] = 0xa14cad;
          CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)*piVar12);
          goto LAB_00a14a06;
        }
      }
    }
    uVar5 = 0;
    piVar12 = (int *)&stack0xffffff84;
  }
  else {
    iVar4 = CBaseAnimatingOverlay::FindGestureLayer();
    cVar3 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
    if (cVar3 == '\0') {
      iVar4 = CBaseAnimatingOverlay::FindGestureLayer();
      cVar3 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
      if (cVar3 != '\0') {
        CBaseAnimatingOverlay::RemoveLayer((CBaseAnimatingOverlay *)this,iVar4,0.2,0.0);
      }
      iVar4 = CBaseAnimatingOverlay::AddGesture();
      uVar5 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
      if ((char)uVar5 != '\0') {
        CBaseAnimatingOverlay::SetLayerLooping((CBaseAnimatingOverlay *)this,iVar4,true);
        piVar12 = (int *)&stack0xffffff84;
        goto LAB_00a14a06;
      }
    }
    uVar5 = 1;
    piVar12 = (int *)&stack0xffffff84;
  }
LAB_00a14a06:
  if (local_40[8] != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(undefined1 **)((int)piVar12 + -4) = &LAB_00a14cea;
    __stack_chk_fail();
  }
  return uVar5;
}

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)