L L4D2node

WitchRetreat::OnContact

0x00a41d70 · 691 bytes · __cdecl

_ZN12WitchRetreat9OnContactEP8InfectedP11CBaseEntityP10CGameTrace

Decompiled

undefined (3 params)

/* WitchRetreat::OnContact(Infected*, CBaseEntity*, CGameTrace*) */

Infected * WitchRetreat::OnContact(Infected *param_1,CBaseEntity *param_2,CGameTrace *param_3)

{
  int *piVar1;
  uint uVar2;
  uint uVar3;
  char cVar4;
  CTerrorPlayer *this;
  uint *puVar5;
  CBaseEntity *pCVar6;
  undefined4 *puVar7;
  int iVar8;
  undefined *puVar9;
  int iVar10;
  int iVar11;
  CBaseEntity *in_stack_00000010;
  int in_stack_00000014;
  undefined4 local_20 [4];
  
  if (in_stack_00000010 != (CBaseEntity *)0x0) {
    cVar4 = IsBreakableEntity(in_stack_00000010,false,true,(CTakeDamageInfo *)0x0);
    if ((((cVar4 == '\0') && (*(char **)(in_stack_00000010 + 0x7c) != "prop_door*")) &&
        (cVar4 = CBaseEntity::ClassMatchesComplex(in_stack_00000010,"prop_door*"), cVar4 == '\0'))
       && ((*(char **)(in_stack_00000010 + 0x7c) != "func_door*" &&
           (cVar4 = CBaseEntity::ClassMatchesComplex(in_stack_00000010,"func_door*"), cVar4 == '\0')
           ))) {
      cVar4 = (**(code **)(*(int *)in_stack_00000010 + 0x16c))();
      if (cVar4 == '\0') {
        iVar11 = (**(code **)(*(int *)in_stack_00000010 + 0x144))();
        if (iVar11 != 0) {
LAB_00a41f83:
          cVar4 = CBaseAnimatingOverlay::IsPlayingGesture((CBaseAnimatingOverlay *)param_3,0x265);
          if (cVar4 == '\0') {
            CBaseAnimatingOverlay::AddGesture((CBaseAnimatingOverlay *)param_3,0x265,1);
            *(undefined4 *)(param_2 + 0x4854) = 0;
          }
        }
      }
      else {
        cVar4 = (**(code **)(*(int *)in_stack_00000010 + 0x16c))();
        this = (CTerrorPlayer *)0x0;
        if (cVar4 != '\0') {
          this = (CTerrorPlayer *)in_stack_00000010;
        }
        cVar4 = CTerrorPlayer::IsStaggering(this);
        if (cVar4 == '\0') {
          puVar5 = (uint *)(**(code **)(*(int *)in_stack_00000010 + 0xc))();
          uVar2 = *puVar5;
          if (0 < *(int *)(param_2 + 0x4854)) {
            iVar11 = 0;
            piVar1 = (int *)(g_pEntityList + (uVar2 & 0xfff) * 0x10 + 4);
            do {
              iVar8 = 0;
              if (uVar2 != 0xffffffff) {
                if (piVar1 == (int *)0x0) {
                  iVar8 = 0;
                }
                else if (piVar1[1] == uVar2 >> 0xc) {
                  iVar8 = *piVar1;
                }
              }
              iVar10 = 0;
              uVar3 = *(uint *)(*(int *)(param_2 + 0x4848) + iVar11 * 4);
              if (((uVar3 != 0xffffffff) &&
                  (puVar9 = g_pEntityList + (uVar3 & 0xfff) * 0x10,
                  puVar9 != (undefined *)0xfffffffc)) && (*(uint *)(puVar9 + 8) == uVar3 >> 0xc)) {
                iVar10 = *(int *)(puVar9 + 4);
              }
              if (iVar8 == iVar10) goto LAB_00a41f83;
              iVar11 = iVar11 + 1;
            } while (iVar11 != *(int *)(param_2 + 0x4854));
          }
          pCVar6 = (CBaseEntity *)(**(code **)(*(int *)param_3 + 0x570))(param_3);
          CTerrorPlayer::OnStaggered(this,pCVar6,(Vector *)0x0);
          local_20[0] = 0xffffffff;
          puVar7 = (undefined4 *)(**(code **)(*(int *)in_stack_00000010 + 0xc))(in_stack_00000010);
          local_20[0] = *puVar7;
          CUtlVector<CHandle<CBaseEntity>,CUtlMemory<CHandle<CBaseEntity>,int>>::InsertBefore
                    ((CUtlVector<CHandle<CBaseEntity>,CUtlMemory<CHandle<CBaseEntity>,int>> *)
                     (param_2 + 0x4848),*(int *)(param_2 + 0x4854),(CHandle *)local_20);
        }
      }
    }
    else if (((in_stack_00000014 == 0) ||
             (*(float *)(in_stack_00000014 + 0x20) <= 0.8 &&
              *(float *)(in_stack_00000014 + 0x20) != 0.8)) &&
            (cVar4 = CBaseAnimatingOverlay::IsPlayingGesture((CBaseAnimatingOverlay *)param_3,0x265)
            , cVar4 == '\0')) {
      CBaseAnimatingOverlay::AddGesture((CBaseAnimatingOverlay *)param_3,0x265,1);
    }
  }
  *(undefined4 *)param_1 = 0;
  *(undefined4 *)(param_1 + 4) = 0;
  *(undefined4 *)(param_1 + 8) = 0;
  *(undefined4 *)(param_1 + 0xc) = 1;
  return param_1;
}

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)