L L4D2node

ZombieBotLocomotion::ResolveCollision

0x00a53190 · 4212 bytes · __cdecl

_ZN19ZombieBotLocomotion16ResolveCollisionERK6VectorS2_i

Decompiled

undefined (3 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* ZombieBotLocomotion::ResolveCollision(Vector const&, Vector const&, int) */

Vector * ZombieBotLocomotion::ResolveCollision(Vector *param_1,Vector *param_2,int param_3)

{
  uint *puVar1;
  bool bVar2;
  char cVar3;
  char cVar4;
  int *piVar5;
  float *pfVar6;
  INextBot *this;
  int iVar7;
  undefined4 *puVar8;
  int iVar9;
  int *piVar10;
  IHandleEntity *pIVar11;
  undefined4 uVar12;
  longdouble lVar13;
  longdouble lVar14;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float *in_stack_00000010;
  int in_stack_00000014;
  uint local_1cc;
  float local_1c8;
  float local_1c0;
  float local_1b8;
  float local_1b4;
  undefined4 local_1a4;
  undefined4 local_1a0;
  undefined4 local_19c;
  undefined4 local_198;
  int local_194;
  float local_190;
  float local_18c;
  float local_188;
  float local_184;
  float local_180;
  float local_17c;
  float local_178;
  float local_174;
  float local_170;
  undefined **local_16c;
  float local_168;
  float local_164;
  int *local_15c;
  float local_158;
  float local_154;
  float local_14c;
  float local_148;
  float local_144;
  float local_13c;
  float local_138;
  float local_134;
  undefined4 local_12c;
  undefined1 local_128;
  undefined1 local_127;
  undefined **local_11c;
  float local_118;
  float local_114;
  int *local_10c;
  float local_108;
  float local_104;
  float local_fc;
  float local_f8;
  float local_f4;
  float local_ec;
  float local_e8;
  float local_e4;
  undefined4 local_dc;
  undefined1 local_d8;
  undefined1 local_d7;
  CGameTrace local_c4 [12];
  float local_b8;
  float local_b4;
  float local_b0;
  float local_ac;
  float local_a8;
  float local_a4;
  float local_98;
  char local_8d;
  int *local_78;
  float local_70;
  float local_6c;
  float local_68;
  float local_44;
  byte local_39;
  
  local_1a4 = 0;
  local_1a0 = 0;
  if (_towlower == 0) {
    local_194 = 0;
  }
  else {
    (**(code **)(_towlower + 0x50))
              (_towlower,&local_1a4,0,0,0,0,
               "/data/src/game/server/terror/zombiebot/zombiebotlocomotion.cpp",0x299,
               &ResolveCollision(Vector_const&,Vector_const&,int)::tm_fmt,"(%s)%s",
               "NextBotExpensive","ZombieBotLocomotion::ResolveCollision");
    local_194 = _towlower;
  }
  iVar7 = _DAT_0105db00;
  local_19c = local_1a4;
  local_198 = local_1a0;
                    /* try { // try from 00a53346 to 00a533a6 has its CatchHandler @ 00a54281 */
  if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
     (iVar9 = ThreadGetCurrentId(), iVar7 == iVar9)) {
    if ((char *)*_DAT_0105d15c != "ZombieBotLocomotion::ResolveCollision") {
      _DAT_0105d15c =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd28814,(char *)0x0,0xca957e);
    }
    puVar1 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
    *puVar1 = *puVar1 | 4;
    CVProfNode::EnterScope();
    DAT_0105d158 = '\0';
  }
                    /* try { // try from 00a53267 to 00a532ef has its CatchHandler @ 00a5427f */
  piVar5 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
  piVar5 = (int *)(**(code **)(*piVar5 + 0xc4))(piVar5);
  if ((piVar5 == (int *)0x0) || (in_stack_00000014 < 0)) {
    *(float *)param_1 = *in_stack_00000010;
    *(float *)(param_1 + 4) = in_stack_00000010[1];
    *(float *)(param_1 + 8) = in_stack_00000010[2];
    goto LAB_00a53954;
  }
                    /* try { // try from 00a53bbd to 00a53c1a has its CatchHandler @ 00a5427f */
  if (((param_2[0x13c] != (Vector)0x0) &&
      (cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,0), cVar3 == '\0')) &&
     (cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,1), cVar3 == '\0')) {
    param_2[0x13c] = (Vector)0x0;
  }
  if ((param_2[0xe4] == (Vector)0x0) &&
     (((*(int *)(param_2 + 0xe8) == 0 || (param_2[0xf0] != (Vector)0x0)) ||
      (cVar3 = (**(code **)(*piVar5 + 0xe8))(piVar5,2), cVar3 == '\0')))) {
                    /* try { // try from 00a533d4 to 00a53459 has its CatchHandler @ 00a5427f */
    lVar14 = (longdouble)(**(code **)(*(int *)param_2 + 0x130))(param_2);
    pfVar6 = (float *)(**(code **)(*piVar5 + 0x128))(piVar5);
    local_188 = (float)lVar14 + pfVar6[2];
    local_190 = *pfVar6;
    local_18c = pfVar6[1];
    iVar7 = *piVar5;
    if (param_2[0x13c] == (Vector)0x0) goto LAB_00a532ea;
LAB_00a5342b:
    lVar14 = (longdouble)(**(code **)(iVar7 + 0x118))(piVar5);
    lVar13 = (longdouble)(**(code **)(*piVar5 + 0x120))(piVar5);
    local_17c = (float)lVar13;
    bVar2 = true;
    local_184 = (float)lVar14 * 0.5;
    local_180 = (float)lVar14 * 0.5;
  }
  else {
    pfVar6 = (float *)(**(code **)(*piVar5 + 0x128))(piVar5);
    local_190 = *pfVar6;
    local_18c = pfVar6[1];
    local_188 = pfVar6[2];
    iVar7 = *piVar5;
    if (param_2[0x13c] != (Vector)0x0) goto LAB_00a5342b;
LAB_00a532ea:
    pfVar6 = (float *)(**(code **)(iVar7 + 300))();
    local_17c = pfVar6[2];
    local_184 = *pfVar6;
    local_180 = pfVar6[1];
    if (local_188 < local_17c) {
      bVar2 = false;
    }
    else {
      local_188 = local_17c - 2.0;
      bVar2 = false;
    }
  }
  local_1cc = 0;
  local_178 = *in_stack_00000010;
  local_174 = in_stack_00000010[1];
  local_170 = in_stack_00000010[2];
  while (cVar3 = DetectCollision((ZombieBotLocomotion *)param_2,local_c4,&stack0x00000014,
                                 (Vector *)param_3,(Vector *)&local_178,(Vector *)&local_190,
                                 (Vector *)&local_184), cVar3 != '\0') {
    if (local_8d == '\0') {
      local_1b8 = local_b4;
      local_1b4 = local_b8;
      local_1c0 = local_b0;
      if ((local_174 - local_b4) * (local_174 - local_b4) +
          (local_178 - local_b8) * (local_178 - local_b8) +
          (local_170 - local_b0) * (local_170 - local_b0) < 1.0) goto LAB_00a53b30;
    }
    if (bVar2) {
      local_1cc = (**(code **)(*piVar5 + 0xf0))(piVar5);
      iVar7 = (**(code **)(*local_78 + 0x148))(local_78);
      if ((iVar7 == 0) && (cVar3 = (**(code **)(*local_78 + 0x16c))(local_78), cVar3 == '\0')) {
        if (local_1cc != 1) {
          piVar10 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
          pIVar11 = (IHandleEntity *)(**(code **)(*piVar10 + 0xb4))(piVar10);
          CTraceFilterSimple::CTraceFilterSimple
                    ((CTraceFilterSimple *)&local_11c,pIVar11,0,IgnoreActorsTraceFilterFunction);
          local_11c = &PTR_ShouldHitEntity_00ca96c8;
          local_108 = 0.0;
          local_10c = piVar10;
          lVar14 = (longdouble)(**(code **)(*piVar5 + 0x124))(piVar5);
          fVar19 = local_180;
          fVar16 = local_184;
          uVar12 = (**(code **)(*piVar5 + 0x130))(piVar5);
          local_12c = 0;
          local_15c = (int *)(local_178 - *(float *)param_3);
          local_158 = local_174 - *(float *)(param_3 + 4);
          local_154 = local_170 - *(float *)(param_3 + 8);
          local_127 = local_158 * local_158 + (float)local_15c * (float)local_15c +
                      local_154 * local_154 != 0.0;
          local_13c = (fVar16 - local_190) * 0.5;
          local_138 = (fVar19 - local_18c) * 0.5;
          local_134 = ((float)lVar14 - local_188) * 0.5;
          local_14c = (local_190 + fVar16) * 0.5;
          local_148 = (local_18c + fVar19) * 0.5;
          local_144 = (local_188 + (float)lVar14) * 0.5;
          local_16c = (undefined **)(*(float *)param_3 + local_14c);
          local_14c = -local_14c;
          local_164 = *(float *)(param_3 + 8) + local_144;
          local_168 = *(float *)(param_3 + 4) + local_148;
          local_128 = local_138 * local_138 + local_13c * local_13c + local_134 * local_134 < 1e-06;
          local_148 = -local_148;
          local_144 = -local_144;
          (**(code **)(*enginetrace + 0x14))(enginetrace,&local_16c,uVar12,&local_11c,&local_70);
          if ((local_44 < 1.0) || (local_39 != 0)) goto LAB_00a53f1b;
        }
      }
      else {
        if (local_1cc != 1) {
LAB_00a537dc:
          if (local_8d == '\0') goto LAB_00a534d0;
          goto LAB_00a537eb;
        }
                    /* try { // try from 00a53ced to 00a54236 has its CatchHandler @ 00a5425b */
        piVar10 = (int *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
        pIVar11 = (IHandleEntity *)(**(code **)(*piVar10 + 0xb4))(piVar10);
        CTraceFilterSimple::CTraceFilterSimple
                  ((CTraceFilterSimple *)&local_16c,pIVar11,0,IgnoreActorsTraceFilterFunction);
        local_16c = &PTR_ShouldHitEntity_00ca96c8;
        local_158 = 0.0;
        local_15c = piVar10;
        uVar12 = (**(code **)(*piVar5 + 0x130))(piVar5);
        local_dc = 0;
        local_108 = local_174 - *(float *)(param_3 + 4);
        local_104 = local_170 - *(float *)(param_3 + 8);
        local_10c = (int *)(local_178 - *(float *)param_3);
        local_d7 = local_104 * local_104 + local_108 * local_108 +
                   (float)local_10c * (float)local_10c != 0.0;
        local_ec = (local_184 - local_190) * 0.5;
        local_e8 = (local_180 - local_18c) * 0.5;
        local_e4 = (local_17c - local_188) * 0.5;
        local_fc = (local_184 + local_190) * 0.5;
        local_f8 = (local_180 + local_18c) * 0.5;
        local_f4 = (local_17c + local_188) * 0.5;
        local_11c = (undefined **)(*(float *)param_3 + local_fc);
        local_fc = -local_fc;
        local_114 = *(float *)(param_3 + 8) + local_f4;
        local_118 = *(float *)(param_3 + 4) + local_f8;
        local_d8 = local_e8 * local_e8 + local_ec * local_ec + local_e4 * local_e4 < 1e-06;
        local_f8 = -local_f8;
        local_f4 = -local_f4;
        (**(code **)(*enginetrace + 0x14))(enginetrace,&local_11c,uVar12,&local_16c,&local_70);
        if (1.0 <= local_44) {
          local_1cc = (uint)local_39;
LAB_00a53f1b:
          if (local_1cc != 1) goto LAB_00a537dc;
        }
      }
      lVar14 = (longdouble)(**(code **)(*piVar5 + 0x124))(piVar5);
      local_17c = (float)lVar14;
      local_1cc = 1;
      fVar16 = local_178;
      fVar15 = local_174;
      local_1c8 = local_170;
    }
    else {
      if (local_8d != '\0') {
LAB_00a537eb:
        piVar10 = local_78;
        cVar3 = local_8d;
        if ((((local_78 != (int *)0x0) && (local_78 != g_WorldEntity)) &&
            ((iVar7 = __dynamic_cast(local_78,&CBaseEntity::typeinfo,&CPhysicsProp::typeinfo,0),
             iVar7 != 0 &&
             ((iVar7 = __dynamic_cast(piVar10,&CBaseEntity::typeinfo,&CBasePropDoor::typeinfo,0),
              iVar7 == 0 && (piVar10 = (int *)piVar10[0x8e], piVar10 != (int *)0x0)))))) &&
           (cVar4 = (**(code **)(*piVar10 + 0x2c))(piVar10), cVar3 = local_8d, cVar4 != '\0')) {
          if (local_78 == (int *)0x0) {
            *(undefined4 *)(param_2 + 0x14c) = 0xffffffff;
          }
          else {
            puVar8 = (undefined4 *)(**(code **)(*local_78 + 0xc))(local_78);
            *(undefined4 *)(param_2 + 0x14c) = *puVar8;
          }
          lVar14 = (longdouble)CountdownTimer::Now();
          if ((float)lVar14 + 1.0 != *(float *)(param_2 + 0x148)) {
            (**(code **)(*(int *)(param_2 + 0x140) + 4))(param_2 + 0x140,param_2 + 0x148);
            *(float *)(param_2 + 0x148) = (float)lVar14 + 1.0;
          }
          cVar3 = local_8d;
          if (*(float *)(param_2 + 0x144) != 1.0) {
            (**(code **)(*(int *)(param_2 + 0x140) + 4))(param_2 + 0x140,param_2 + 0x144);
            *(undefined4 *)(param_2 + 0x144) = 0x3f800000;
            cVar3 = local_8d;
          }
        }
        local_8d = cVar3;
        local_1b4 = *(float *)(param_2 + 0x88);
        local_1b8 = *(float *)(param_2 + 0x8c);
        local_1c0 = *(float *)(param_2 + 0x90);
        goto LAB_00a53cd7;
      }
LAB_00a534d0:
      in_stack_00000014 = in_stack_00000014 + -1;
      if (in_stack_00000014 < 1) {
        local_1b4 = local_b8;
        local_1b8 = local_b4;
        local_1c0 = local_b0;
        goto LAB_00a53b30;
      }
      if (local_a4 < 0.0) {
        local_a4 = 0.0;
        VectorNormalize((Vector *)&local_ac);
      }
      fVar18 = local_178 - *(float *)param_3;
      fVar17 = local_174 - *(float *)(param_3 + 4);
      fVar15 = local_170 - *(float *)(param_3 + 8);
      fVar19 = 1.0 - local_98;
                    /* try { // try from 00a5355c to 00a538a6 has its CatchHandler @ 00a5425b */
      cVar3 = (**(code **)(*piVar5 + 0xe8))(piVar5,2);
      fVar16 = local_a4;
      local_1c8 = fVar15;
      if (((cVar3 == '\0') &&
          (lVar14 = (longdouble)(**(code **)(*(int *)param_2 + 0x154))(param_2),
          fVar16 < (float)lVar14)) && (0.0 < fVar15)) {
        local_a4 = 0.0;
        VectorNormalize((Vector *)&local_ac);
        local_1c8 = 0.0;
      }
      fVar19 = (fVar17 * local_a8 + fVar18 * local_ac + fVar15 * local_a4) * fVar19;
      fVar16 = local_ac * fVar19;
      fVar15 = local_a8 * fVar19;
      fVar19 = fVar19 * local_a4;
      this = (INextBot *)(**(code **)(*(int *)param_2 + 0xb0))(param_2);
      cVar3 = INextBot::IsDebugging(this,0x10);
      if (cVar3 != '\0') {
        local_6c = local_a8 * 20.0 + local_b4;
        local_68 = local_a4 * 20.0 + local_b0;
        local_70 = local_ac * 20.0 + local_b8;
                    /* try { // try from 00a53a4f to 00a53aef has its CatchHandler @ 00a5425b */
        NDebugOverlay::Line((Vector *)&local_b8,(Vector *)&local_70,0xff,0,0x96,true,15.0);
      }
      fVar16 = (fVar18 + *(float *)param_3) - fVar16;
      fVar15 = (fVar17 + *(float *)(param_3 + 4)) - fVar15;
      local_1c8 = (*(float *)(param_3 + 8) - fVar19) + local_1c8;
      local_1b4 = local_b8;
      fVar18 = fVar16 - local_b8;
      local_1b8 = local_b4;
      fVar19 = fVar15 - local_b4;
      local_1c0 = local_b0;
      fVar17 = local_1c8 - local_b0;
      if (fVar19 * fVar19 + fVar18 * fVar18 + fVar17 * fVar17 < 1.0) goto LAB_00a53cd7;
    }
    local_170 = local_1c8;
    local_174 = fVar15;
    local_178 = fVar16;
    bVar2 = false;
  }
  local_1b4 = local_178;
  local_1b8 = local_174;
  local_1c0 = local_170;
LAB_00a53cd7:
  if (local_8d == '\0') {
LAB_00a53b30:
    *(float *)(param_2 + 0x88) = local_1b4;
    *(float *)(param_2 + 0x90) = local_1c0;
    *(float *)(param_2 + 0x8c) = local_1b8;
  }
  if (param_2[0x13c] != (Vector)0x0) {
    param_2[0x13c] = (Vector)0x0;
                    /* try { // try from 00a53c76 to 00a53c98 has its CatchHandler @ 00a5427f */
    cVar3 = (**(code **)(*piVar5 + 0x100))(piVar5,local_1cc);
    if (cVar3 == '\0') {
      (**(code **)(*piVar5 + 0xec))(piVar5,local_1cc);
    }
  }
  *(float *)param_1 = local_1b4;
  *(float *)(param_1 + 4) = local_1b8;
  *(float *)(param_1 + 8) = local_1c0;
LAB_00a53954:
  iVar7 = _DAT_0105db00;
  if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
     (iVar9 = ThreadGetCurrentId(), iVar7 == iVar9)) {
    cVar3 = CVProfNode::ExitScope();
    if (cVar3 != '\0') {
      _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
    }
    DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
  }
  if (local_194 != 0) {
    (**(code **)(local_194 + 0x54))(local_194,local_19c,local_198,0,0,0);
  }
  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)