L L4D2node

CTerrorGameMovement::LockTraceFilter

0x004f9990 · 1376 bytes · __thiscall

_ZN19CTerrorGameMovement15LockTraceFilterEi

Decompiled

undefined (2 params)

/* CTerrorGameMovement::LockTraceFilter(int) */

undefined4 * __thiscall CTerrorGameMovement::LockTraceFilter(CTerrorGameMovement *this,int param_1)

{
  char cVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  uint uVar5;
  undefined4 uVar6;
  code *pcVar7;
  undefined4 *puVar8;
  undefined *puVar9;
  int iVar10;
  undefined *local_20;
  
  iVar2 = 0;
  iVar4 = *(int *)(this + 4);
  uVar5 = *(uint *)(iVar4 + 0x2338);
  if (((uVar5 != 0xffffffff) &&
      (puVar9 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar9 != (undefined *)0xfffffffc)) &&
     (*(uint *)(puVar9 + 8) == uVar5 >> 0xc)) {
    iVar2 = *(int *)(puVar9 + 4);
  }
  if (this[0x63e] != (CTerrorGameMovement)0x0) {
    iVar2 = 0;
  }
  iVar10 = s_pIgnoreEntity;
  if (s_pIgnoreEntity == 0) {
    iVar10 = iVar2;
  }
  if (7 < s_nTraceFilterCount) {
    return (undefined4 *)0x0;
  }
  piVar3 = *(int **)(this + 0x810);
  if (piVar3 == (int *)0x0) {
LAB_004f9bb7:
    iVar2 = s_nTraceFilterCount * 0x14;
    puVar8 = (undefined4 *)(s_TraceFilterSkipTwoEntities + iVar2);
    s_nTraceFilterCount = s_nTraceFilterCount + 1;
    (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 8))(puVar8,iVar4);
    (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 0x10))(puVar8,iVar10);
    iVar4 = *(int *)(s_TraceFilterSkipTwoEntities + iVar2);
LAB_004f9bf1:
    (**(code **)(iVar4 + 0xc))(puVar8,param_1);
    return puVar8;
  }
  cVar1 = (**(code **)(*piVar3 + 0x558))(piVar3);
  iVar4 = s_nTraceFilterCount;
  if (cVar1 != '\0') {
    iVar2 = s_nTraceFilterCount * 6;
    puVar8 = &s_TraceFilterPlayerMovement + s_nTraceFilterCount * 6;
    s_nTraceFilterCount = s_nTraceFilterCount + 1;
    (**(code **)((&s_TraceFilterPlayerMovement)[iVar2] + 8))(puVar8,*(undefined4 *)(this + 4));
    (**(code **)((&s_TraceFilterPlayerMovement)[iVar4 * 6] + 0x10))(puVar8,iVar10);
    (**(code **)((&s_TraceFilterPlayerMovement)[iVar4 * 6] + 0xc))(puVar8,param_1);
    return puVar8;
  }
  piVar3 = *(int **)(this + 0x810);
  uVar5 = piVar3[0xf9a];
  local_20 = g_pEntityList;
  if (((((uVar5 == 0xffffffff) ||
        (puVar9 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
       ((*(uint *)(puVar9 + 8) != uVar5 >> 0xc || (*(int *)(puVar9 + 4) == 0)))) &&
      (((uVar5 = piVar3[0xf92], uVar5 == 0xffffffff ||
        (puVar9 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
       ((*(uint *)(puVar9 + 8) != uVar5 >> 0xc || (*(int *)(puVar9 + 4) == 0)))))) &&
     ((((uVar5 = piVar3[0xcf1], uVar5 == 0xffffffff ||
        (puVar9 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
       (*(uint *)(puVar9 + 8) != uVar5 >> 0xc)) ||
      ((*(int *)(puVar9 + 4) == 0 || (*(char *)((int)piVar3 + 0x39f1) != '\0')))))) {
    cVar1 = (**(code **)(*piVar3 + 0x7e8))(piVar3);
    iVar4 = s_nTraceFilterCount;
    if (cVar1 != '\0') {
      iVar2 = s_nTraceFilterCount * 4;
      puVar8 = &s_TraceFilterNoNPCsOrPlayer + s_nTraceFilterCount * 4;
      s_nTraceFilterCount = s_nTraceFilterCount + 1;
      (**(code **)((&s_TraceFilterNoNPCsOrPlayer)[iVar2] + 8))(puVar8,iVar10);
      iVar4 = (&s_TraceFilterNoNPCsOrPlayer)[iVar4 * 4];
      goto LAB_004f9bf1;
    }
    piVar3 = *(int **)(this + 0x810);
    local_20 = g_pEntityList;
  }
  iVar4 = s_nTraceFilterCount;
  uVar5 = piVar3[0xfb8];
  g_pEntityList = local_20;
  if (((uVar5 != 0xffffffff) &&
      (puVar9 = local_20 + (uVar5 & 0xfff) * 0x10, puVar9 != (undefined *)0xfffffffc)) &&
     ((*(uint *)(puVar9 + 8) == uVar5 >> 0xc && (*(int *)(puVar9 + 4) != 0)))) {
    iVar2 = s_nTraceFilterCount * 4;
    puVar8 = &s_TraceFilterNoNPCsOrPlayer + s_nTraceFilterCount * 4;
    s_nTraceFilterCount = s_nTraceFilterCount + 1;
    (**(code **)((&s_TraceFilterNoNPCsOrPlayer)[iVar2] + 8))(puVar8,*(undefined4 *)(this + 4));
    iVar4 = (&s_TraceFilterNoNPCsOrPlayer)[iVar4 * 4];
    goto LAB_004f9d1b;
  }
  uVar5 = piVar3[0xa93];
  if ((((uVar5 == 0xffffffff) ||
       (puVar9 = local_20 + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
      (*(uint *)(puVar9 + 8) != uVar5 >> 0xc)) || (*(int *)(puVar9 + 4) == 0)) {
    uVar5 = piVar3[0xa92];
    if (((uVar5 == 0xffffffff) ||
        (puVar9 = local_20 + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
       ((*(uint *)(puVar9 + 8) != uVar5 >> 0xc || (*(int *)(puVar9 + 4) == 0)))) {
      uVar5 = piVar3[0xf93];
      if ((((uVar5 == 0xffffffff) ||
           (puVar9 = local_20 + (uVar5 & 0xfff) * 0x10, puVar9 == (undefined *)0xfffffffc)) ||
          (*(uint *)(puVar9 + 8) != uVar5 >> 0xc)) || (*(int *)(puVar9 + 4) == 0)) {
        uVar5 = piVar3[0xf92];
        if ((((uVar5 == 0xffffffff) ||
             (local_20 = local_20 + (uVar5 & 0xfff) * 0x10, local_20 == (undefined *)0xfffffffc)) ||
            (*(uint *)(local_20 + 8) != uVar5 >> 0xc)) || (*(int *)(local_20 + 4) == 0)) {
          iVar4 = *(int *)(this + 4);
          goto LAB_004f9bb7;
        }
        iVar2 = s_nTraceFilterCount * 0x14;
        puVar8 = (undefined4 *)(s_TraceFilterSkipTwoEntities + iVar2);
        s_nTraceFilterCount = s_nTraceFilterCount + 1;
        (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 8))
                  (puVar8,*(undefined4 *)(this + 4));
        pcVar7 = *(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 0x10);
        uVar5 = *(uint *)(*(int *)(this + 0x810) + 0x3e48);
      }
      else {
        iVar2 = s_nTraceFilterCount * 0x14;
        puVar8 = (undefined4 *)(s_TraceFilterSkipTwoEntities + iVar2);
        s_nTraceFilterCount = s_nTraceFilterCount + 1;
        (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 8))
                  (puVar8,*(undefined4 *)(this + 4));
        pcVar7 = *(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 0x10);
        uVar5 = *(uint *)(*(int *)(this + 0x810) + 0x3e4c);
      }
      goto joined_r0x004f9f1f;
    }
    iVar2 = s_nTraceFilterCount * 0x14;
    puVar8 = (undefined4 *)(s_TraceFilterSkipTwoEntities + iVar2);
    s_nTraceFilterCount = s_nTraceFilterCount + 1;
    (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 8))
              (puVar8,*(undefined4 *)(this + 4));
    pcVar7 = *(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 0x10);
    uVar5 = *(uint *)(*(int *)(this + 0x810) + 0x2a48);
    if (uVar5 != 0xffffffff) goto LAB_004f9d90;
LAB_004f9dac:
    uVar6 = 0;
  }
  else {
    iVar2 = s_nTraceFilterCount * 0x14;
    puVar8 = (undefined4 *)(s_TraceFilterSkipTwoEntities + iVar2);
    s_nTraceFilterCount = s_nTraceFilterCount + 1;
    (**(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 8))
              (puVar8,*(undefined4 *)(this + 4));
    pcVar7 = *(code **)(*(int *)(s_TraceFilterSkipTwoEntities + iVar2) + 0x10);
    uVar5 = *(uint *)(*(int *)(this + 0x810) + 0x2a4c);
joined_r0x004f9f1f:
    if (uVar5 == 0xffffffff) goto LAB_004f9dac;
LAB_004f9d90:
    puVar9 = g_pEntityList + (uVar5 & 0xfff) * 0x10;
    if ((puVar9 == (undefined *)0xfffffffc) || (*(uint *)(puVar9 + 8) != uVar5 >> 0xc))
    goto LAB_004f9dac;
    uVar6 = *(undefined4 *)(puVar9 + 4);
  }
  (*pcVar7)(puVar8,uVar6);
  iVar4 = *(int *)(s_TraceFilterSkipTwoEntities + iVar4 * 0x14);
LAB_004f9d1b:
  (**(code **)(iVar4 + 0xc))(puVar8,param_1);
  return puVar8;
}

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)