L L4D2node

CTraceFilterMelee::ShouldHitEntity

0x005f2aa0 · 1008 bytes · __thiscall

_ZN17CTraceFilterMelee15ShouldHitEntityEP13IHandleEntityi

Decompiled

undefined (3 params)

/* CTraceFilterMelee::ShouldHitEntity(IHandleEntity*, int) */

uint __thiscall
CTraceFilterMelee::ShouldHitEntity(CTraceFilterMelee *this,IHandleEntity *param_1,int param_2)

{
  float fVar1;
  uint uVar2;
  undefined4 *puVar3;
  char cVar4;
  int *piVar5;
  float *pfVar6;
  float *pfVar7;
  Vector *pVVar8;
  int iVar9;
  int iVar10;
  undefined *puVar11;
  uint uVar12;
  CBaseEntity *pCVar13;
  float local_94;
  float local_90;
  float local_8c;
  undefined4 local_88;
  undefined4 local_84;
  undefined4 local_80;
  undefined4 local_7c;
  undefined4 local_78;
  undefined4 local_74;
  undefined4 local_70;
  undefined4 local_6c;
  undefined4 local_68;
  undefined4 local_64;
  undefined4 local_60;
  undefined4 local_5c;
  undefined4 local_58;
  undefined4 local_54;
  undefined4 local_50;
  undefined4 local_4c;
  uint local_48;
  undefined4 local_44;
  float local_40;
  undefined4 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  undefined4 local_30;
  undefined4 local_2c;
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  cVar4 = StandardFilterRules(param_1,param_2);
  if (((cVar4 == '\0') ||
      (cVar4 = PassServerEntityFilter(param_1,*(IHandleEntity **)(this + 4)), cVar4 == '\0')) ||
     (uVar12 = (**(code **)(*staticpropmgr + 8))(staticpropmgr,param_1), (char)uVar12 != '\0')) {
    uVar12 = 0;
  }
  else if (((param_1 != (IHandleEntity *)0x0) &&
           (cVar4 = (**(code **)(*(int *)param_1 + 0x4c))(param_1,*(undefined4 *)(this + 8),param_2)
           , cVar4 != '\0')) &&
          ((cVar4 = (**(code **)(*g_pGameRules + 0x74))
                              (g_pGameRules,*(undefined4 *)(this + 8),
                               *(undefined4 *)(param_1 + 0x234)), cVar4 != '\0' &&
           (param_1[0x105] != (IHandleEntity)0x0)))) {
    uVar2 = *(uint *)(*(int *)(this + 0xc) + 0x34);
    piVar5 = (int *)0x0;
    if (((uVar2 != 0xffffffff) &&
        (puVar11 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)) &&
       (*(uint *)(puVar11 + 8) == uVar2 >> 0xc)) {
      piVar5 = *(int **)(puVar11 + 4);
    }
    pfVar6 = (float *)(**(code **)(*piVar5 + 0x288))(piVar5);
    pfVar7 = (float *)(**(code **)(*(int *)param_1 + 0x288))(param_1);
    local_94 = *pfVar7 - *pfVar6;
    local_90 = pfVar7[1] - pfVar6[1];
    local_8c = pfVar7[2] - pfVar6[2];
    VectorNormalize((Vector *)&local_94);
    puVar3 = *(undefined4 **)(this + 0xc);
    local_7c = *puVar3;
    local_44 = puVar3[0xe];
    local_40 = (float)puVar3[0xf];
    local_78 = puVar3[1];
    local_74 = puVar3[2];
    local_70 = puVar3[3];
    local_6c = puVar3[4];
    local_68 = puVar3[5];
    local_64 = puVar3[6];
    local_60 = puVar3[7];
    local_5c = puVar3[8];
    local_58 = puVar3[9];
    local_54 = puVar3[10];
    local_50 = puVar3[0xb];
    local_4c = puVar3[0xc];
    local_48 = puVar3[0xd];
    local_34 = puVar3[0x12];
    local_3c = puVar3[0x10];
    local_38 = puVar3[0x11];
    local_30 = puVar3[0x13];
    local_24 = puVar3[0x16];
    local_2c = puVar3[0x14];
    local_28 = puVar3[0x15];
    local_20 = puVar3[0x17];
    piVar5 = (int *)0x0;
    fVar1 = *(float *)(this + 0x14);
    if (((local_48 != 0xffffffff) &&
        (puVar11 = g_pEntityList + (local_48 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc))
       && (*(uint *)(puVar11 + 8) == local_48 >> 0xc)) {
      piVar5 = *(int **)(puVar11 + 4);
    }
    pVVar8 = (Vector *)(**(code **)(*piVar5 + 0x288))(piVar5);
    CalculateMeleeDamageForce((CTakeDamageInfo *)&local_7c,(Vector *)&local_94,pVVar8,fVar1);
    piVar5 = (int *)0x0;
    if (((local_48 != 0xffffffff) &&
        (puVar11 = g_pEntityList + (local_48 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc))
       && (*(uint *)(puVar11 + 8) == local_48 >> 0xc)) {
      piVar5 = *(int **)(puVar11 + 4);
    }
    piVar5 = (int *)(**(code **)(*piVar5 + 0x144))(piVar5);
    iVar9 = (**(code **)(*(int *)param_1 + 0x144))(param_1);
    if (iVar9 != 0 && piVar5 != (int *)0x0) {
      if ((this[0x18] != (CTraceFilterMelee)0x0) ||
         (iVar10 = (**(code **)(*piVar5 + 0x4f4))(piVar5,param_1), iVar10 == 1)) {
        if (local_40 != 0.0) {
          CBaseEntity::TakeDamage((CBaseEntity *)param_1,(CTakeDamageInfo *)&local_7c);
        }
        pCVar13 = (CBaseEntity *)0x0;
        if (((local_48 != 0xffffffff) &&
            (puVar11 = g_pEntityList + (local_48 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc
            )) && (*(uint *)(puVar11 + 8) == local_48 >> 0xc)) {
          pCVar13 = *(CBaseEntity **)(puVar11 + 4);
        }
        local_88 = local_70;
        local_84 = local_6c;
        local_80 = local_68;
        CSoundEnt::InsertSound(1,(Vector *)&local_88,200,0.2,pCVar13,0,(CBaseEntity *)0x0);
        uVar12 = (uint)(iVar9 != 0 && piVar5 != (int *)0x0);
        *(IHandleEntity **)(this + 0x10) = param_1;
      }
    }
    else {
      *(IHandleEntity **)(this + 0x10) = param_1;
      Pickup_ForcePlayerToDropThisObject((CBaseEntity *)param_1);
      if (local_40 != 0.0) {
        CBaseEntity::TakeDamage((CBaseEntity *)param_1,(CTakeDamageInfo *)&local_7c);
      }
    }
  }
  return uVar12;
}

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)