L L4D2node

rr2::CRule::Match

0x00bd9c40 · 2776 bytes · __thiscall

_ZN3rr25CRule5MatchEPNS_14CResponseQueryEPNS_11MatchInfo_tE

Decompiled

undefined (3 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* rr2::CRule::Match(rr2::CResponseQuery*, rr2::MatchInfo_t*) */

longdouble __thiscall rr2::CRule::Match(CRule *this,CResponseQuery *param_1,MatchInfo_t *param_2)

{
  ushort *puVar1;
  float fVar2;
  float fVar3;
  int iVar4;
  int *piVar5;
  undefined4 uVar6;
  undefined4 uVar7;
  undefined4 uVar8;
  ushort *puVar9;
  char cVar10;
  byte bVar11;
  int iVar12;
  ushort uVar13;
  ushort uVar14;
  ushort *puVar15;
  int iVar16;
  bool bVar17;
  float fVar18;
  float fVar19;
  int local_6c;
  float local_68;
  float local_64;
  int local_54;
  ushort *local_50;
  int local_48;
  int local_44;
  undefined4 local_34;
  undefined4 local_30;
  undefined4 local_2c;
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  local_34 = 0;
  local_30 = 0;
  if (___atan2f_finite == 0) {
    local_6c = 0;
  }
  else {
    (**(code **)(___atan2f_finite + 0x50))
              (___atan2f_finite,&local_34,0,0,0,0,"/data/src/responselib/rule.cpp",0x124,
               &Match(rr2::CResponseQuery*,rr2::MatchInfo_t*)::tm_fmt,"(%s)%s","Unaccounted",
               "CRule::Match");
    local_6c = ___atan2f_finite;
  }
  uVar8 = local_30;
  uVar7 = local_34;
  iVar4 = _DAT_0105db00;
                    /* try { // try from 00bd9e6e to 00bd9ebc has its CatchHandler @ 00bda789 */
  if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
     (iVar12 = ThreadGetCurrentId(), iVar4 == iVar12)) {
    if ((char *)*_DAT_0105d15c != "CRule::Match") {
      _DAT_0105d15c =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd57166,(char *)0x1,0xbfafa1);
    }
    CVProfNode::EnterScope();
    DAT_0105d158 = '\0';
  }
  *(undefined4 *)(param_2 + 8) = 0;
  *(undefined4 *)param_2 = 0xcf000000;
  *(undefined2 *)(param_2 + 6) = 0;
  *(undefined2 *)(param_2 + 4) = 0;
  iVar4 = *(int *)(this + 8);
  if (iVar4 < 1) {
    local_64 = 0.0;
LAB_00bd9f6b:
    iVar4 = *(int *)(this + 0x18);
    if (0 < iVar4) {
      iVar16 = 0;
      local_50 = (ushort *)0x0;
      fVar18 = 0.0;
      iVar12 = *(int *)(param_1 + 0xc);
      do {
        puVar1 = (ushort *)(*(int *)(this + 0x10) + (int)local_50 * 0x14);
        if (iVar12 <= iVar16) goto LAB_00bd9db0;
        uVar14 = *puVar1;
        puVar15 = (ushort *)(*(int *)param_1 + iVar16 * 0x10);
        uVar13 = *puVar15;
        if (uVar13 < uVar14) {
          puVar9 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
          do {
            puVar15 = puVar9;
            iVar16 = iVar16 + 1;
            if (iVar16 == iVar12) goto LAB_00bd9db0;
            uVar13 = *puVar15;
            puVar9 = puVar15 + 8;
          } while (uVar13 < uVar14);
        }
        if (uVar13 != uVar14) goto LAB_00bd9db0;
        bVar11 = (byte)puVar1[4];
        if ((bVar11 & 1) == 0) {
          bVar11 = (*(int *)(puVar15 + 4) <= **(int **)(puVar1 + 8) &&
                   **(int **)(puVar1 + 6) <= *(int *)(puVar15 + 4)) ^ bVar11 >> 1 & 1;
        }
        else {
          bVar17 = false;
          fVar19 = *(float *)(puVar15 + 6);
          if (**(float **)(puVar1 + 6) <= fVar19) {
            bVar17 = fVar19 < **(float **)(puVar1 + 8) || fVar19 == **(float **)(puVar1 + 8);
          }
          bVar11 = bVar11 >> 1 & 1 ^ bVar17;
        }
        if (bVar11 == 0) goto LAB_00bd9db0;
        local_50 = (ushort *)((int)local_50 + 1);
        fVar19 = *(float *)(puVar1 + 2);
        fVar2 = *(float *)(puVar15 + 2);
        *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
        fVar18 = fVar18 + fVar19 * fVar2;
      } while (local_50 != (ushort *)iVar4);
      if (fVar18 <= 0.0) goto LAB_00bd9db0;
      local_64 = fVar18 + local_64;
    }
    iVar4 = *(int *)(this + 0x28);
    if (0 < iVar4) {
      iVar16 = 0;
      local_48 = 0;
      local_68 = 0.0;
      iVar12 = *(int *)(param_1 + 0xc);
      do {
        puVar1 = (ushort *)(*(int *)(this + 0x20) + local_48 * 0xc);
        piVar5 = *(int **)(puVar1 + 4);
        bVar11 = *(byte *)(piVar5 + 2);
        if (bVar11 == 0x10) {
          local_2c = 0;
          local_28 = 0;
          cVar10 = (**(code **)(*piVar5 + 0xc))(piVar5,puVar1,&local_2c,param_1);
          if (cVar10 == '\0') goto LAB_00bd9db0;
          fVar18 = *(float *)(puVar1 + 2);
          *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
        }
        else {
          if (iVar12 <= iVar16) goto LAB_00bd9db0;
          uVar14 = *puVar1;
          puVar15 = (ushort *)(*(int *)param_1 + iVar16 * 0x10);
          uVar13 = *puVar15;
          if (uVar13 < uVar14) {
            puVar9 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
            do {
              puVar15 = puVar9;
              iVar16 = iVar16 + 1;
              if (iVar16 == iVar12) goto LAB_00bd9db0;
              uVar13 = *puVar15;
              puVar9 = puVar15 + 8;
            } while (uVar13 < uVar14);
          }
          if (uVar13 != uVar14) goto LAB_00bd9db0;
          if (bVar11 == (bVar11 & 3)) {
            bVar17 = (*(uint *)(puVar15 + 6) & 0x7f800000) != 0x7f800000;
LAB_00bda44c:
            if (!bVar17) goto LAB_00bd9db0;
          }
          else {
            if (bVar11 == (bVar11 & 0xc)) {
              bVar17 = (*(uint *)(puVar15 + 6) & 0x7f800000) == 0x7f800000;
              goto LAB_00bda44c;
            }
            if (bVar11 != 0x10) goto LAB_00bd9db0;
          }
                    /* try { // try from 00bda1af to 00bda70d has its CatchHandler @ 00bda7c6 */
          cVar10 = (**(code **)(*piVar5 + 0xc))(piVar5,puVar1,puVar15 + 4,param_1);
          if (cVar10 == '\0') goto LAB_00bd9db0;
          fVar18 = *(float *)(puVar1 + 2) * *(float *)(puVar15 + 2);
          *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
        }
        local_68 = fVar18 + local_68;
        local_48 = local_48 + 1;
      } while (local_48 != iVar4);
      if (local_68 <= 0.0) goto LAB_00bd9db0;
      local_64 = local_64 + local_68;
    }
    fVar18 = 0.0;
    iVar4 = *(int *)(this + 0x38);
    iVar12 = *(int *)(param_1 + 0xc);
    if (0 < iVar4) {
      local_50 = (ushort *)0x0;
      fVar18 = 0.0;
      iVar16 = 0;
LAB_00bda230:
      do {
        puVar1 = (ushort *)(*(int *)(this + 0x30) + (int)local_50 * 0x14);
        if (iVar16 < iVar12) {
          puVar15 = (ushort *)(*(int *)param_1 + iVar16 * 0x10);
          uVar14 = *puVar15;
          uVar13 = *puVar1;
          if (uVar14 < uVar13) {
            puVar9 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
            do {
              puVar15 = puVar9;
              iVar16 = iVar16 + 1;
              if (iVar16 == iVar12) goto LAB_00bda29b;
              uVar14 = *puVar15;
              puVar9 = puVar15 + 8;
            } while (uVar14 < uVar13);
          }
          if (uVar13 == uVar14) {
            if ((puVar1[4] & 1) == 0) {
              if (*(int *)(puVar15 + 4) < *(int *)(puVar1 + 6)) goto LAB_00bda29b;
              if (*(int *)(puVar15 + 4) <= *(int *)(puVar1 + 8)) goto LAB_00bda57f;
            }
            else {
              fVar19 = *(float *)(puVar15 + 6);
              if ((fVar19 < *(float *)(puVar1 + 6)) ||
                 (*(float *)(puVar1 + 8) <= fVar19 && fVar19 != *(float *)(puVar1 + 8)))
              goto LAB_00bda29b;
LAB_00bda57f:
              fVar19 = *(float *)(puVar1 + 2);
              fVar2 = *(float *)(puVar15 + 2);
              *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
              fVar18 = fVar18 + fVar19 * fVar2;
            }
            local_50 = (ushort *)((int)local_50 + 1);
            if (local_50 == (ushort *)iVar4) break;
            goto LAB_00bda230;
          }
        }
LAB_00bda29b:
        local_50 = (ushort *)((int)local_50 + 1);
      } while (local_50 != (ushort *)iVar4);
      iVar12 = *(int *)(param_1 + 0xc);
    }
    fVar19 = 0.0;
    iVar4 = *(int *)(this + 0x48);
    if (0 < iVar4) {
      local_50 = (ushort *)0x0;
      fVar19 = 0.0;
      iVar16 = 0;
LAB_00bda2d8:
      do {
        puVar1 = (ushort *)(*(int *)(this + 0x40) + (int)local_50 * 0x14);
        if (iVar16 < iVar12) {
          uVar14 = *puVar1;
          puVar15 = (ushort *)(*(int *)param_1 + iVar16 * 0x10);
          uVar13 = *puVar15;
          if (uVar13 < uVar14) {
            puVar9 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
            do {
              puVar15 = puVar9;
              iVar16 = iVar16 + 1;
              if (iVar16 == iVar12) goto LAB_00bda33b;
              uVar13 = *puVar15;
              puVar9 = puVar15 + 8;
            } while (uVar13 < uVar14);
          }
          if (uVar13 == uVar14) {
            bVar11 = (byte)puVar1[4];
            if ((bVar11 & 1) == 0) {
              bVar11 = (*(int *)(puVar15 + 4) <= **(int **)(puVar1 + 8) &&
                       **(int **)(puVar1 + 6) <= *(int *)(puVar15 + 4)) ^ bVar11 >> 1 & 1;
            }
            else {
              bVar17 = false;
              fVar2 = *(float *)(puVar15 + 6);
              if (**(float **)(puVar1 + 6) <= fVar2) {
                bVar17 = fVar2 < **(float **)(puVar1 + 8) || fVar2 == **(float **)(puVar1 + 8);
              }
              bVar11 = bVar11 >> 1 & 1 ^ bVar17;
            }
            if (bVar11 != 0) {
              local_50 = (ushort *)((int)local_50 + 1);
              fVar2 = *(float *)(puVar1 + 2);
              fVar3 = *(float *)(puVar15 + 2);
              *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
              fVar19 = fVar19 + fVar2 * fVar3;
              if (local_50 == (ushort *)iVar4) break;
              goto LAB_00bda2d8;
            }
          }
        }
LAB_00bda33b:
        local_50 = (ushort *)((int)local_50 + 1);
      } while (local_50 != (ushort *)iVar4);
      iVar12 = *(int *)(param_1 + 0xc);
    }
    iVar4 = *(int *)(this + 0x58);
    if (iVar4 < 1) {
      local_68 = 0.0;
    }
    else {
      iVar16 = 0;
      local_44 = 0;
      local_68 = 0.0;
      do {
        while( true ) {
          puVar1 = (ushort *)(*(int *)(this + 0x50) + local_44 * 0xc);
          piVar5 = *(int **)(puVar1 + 4);
          bVar11 = *(byte *)(piVar5 + 2);
          if (bVar11 != 0x10) break;
          local_24 = 0;
          local_20 = 0;
          cVar10 = (**(code **)(*piVar5 + 0xc))(piVar5,puVar1,&local_24,param_1);
          if (cVar10 != '\0') {
            local_68 = local_68 + *(float *)(puVar1 + 2);
            *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
          }
joined_r0x00bda671:
          local_44 = local_44 + 1;
          if (local_44 == iVar4) goto LAB_00bda413;
        }
        if (iVar12 <= iVar16) goto joined_r0x00bda671;
        local_50 = (ushort *)(iVar16 * 0x10 + *(int *)param_1);
        uVar14 = *local_50;
        uVar13 = *puVar1;
        if (uVar14 < uVar13) {
          puVar15 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
          do {
            local_50 = puVar15;
            iVar16 = iVar16 + 1;
            if (iVar16 == iVar12) goto joined_r0x00bda671;
            uVar14 = *local_50;
            puVar15 = local_50 + 8;
          } while (uVar14 < uVar13);
        }
        if (uVar13 != uVar14) goto joined_r0x00bda671;
        if (bVar11 != (bVar11 & 3)) {
          if (bVar11 == (bVar11 & 0xc)) {
            bVar17 = (*(uint *)(local_50 + 6) & 0x7f800000) == 0x7f800000;
            goto LAB_00bda6b9;
          }
          if (bVar11 != 0x10) goto joined_r0x00bda671;
LAB_00bda620:
          cVar10 = (**(code **)(*piVar5 + 0xc))(piVar5,puVar1,local_50 + 4,param_1);
          if (cVar10 != '\0') {
            local_68 = *(float *)(puVar1 + 2) * *(float *)(local_50 + 2) + local_68;
            *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
          }
          goto joined_r0x00bda671;
        }
        bVar17 = (*(uint *)(local_50 + 6) & 0x7f800000) != 0x7f800000;
LAB_00bda6b9:
        if (bVar17) goto LAB_00bda620;
        local_44 = local_44 + 1;
      } while (local_44 != iVar4);
    }
LAB_00bda413:
    local_68 = fVar18 + local_64 + fVar19 + local_68;
    if (0.0 < local_68) {
      uVar6 = *(undefined4 *)(this + 0x60);
      *(float *)param_2 = local_68;
      *(undefined4 *)(param_2 + 8) = uVar6;
    }
  }
  else {
    iVar16 = 0;
    local_64 = 0.0;
    local_54 = 0;
    iVar12 = *(int *)(param_1 + 0xc);
    do {
      puVar1 = (ushort *)(*(int *)this + local_54 * 0x14);
      if (iVar12 <= iVar16) goto LAB_00bd9db0;
      uVar14 = *puVar1;
      puVar15 = (ushort *)(*(int *)param_1 + iVar16 * 0x10);
      uVar13 = *puVar15;
      if (uVar13 < uVar14) {
        puVar9 = (ushort *)(*(int *)param_1 + 0x10 + iVar16 * 0x10);
        do {
          puVar15 = puVar9;
          iVar16 = iVar16 + 1;
          if (iVar16 == iVar12) goto LAB_00bd9db0;
          uVar13 = *puVar15;
          puVar9 = puVar15 + 8;
        } while (uVar13 < uVar14);
      }
      if (uVar13 != uVar14) goto LAB_00bd9db0;
      if ((puVar1[4] & 1) == 0) {
        if ((*(int *)(puVar15 + 4) < *(int *)(puVar1 + 6)) ||
           (*(int *)(puVar1 + 8) < *(int *)(puVar15 + 4))) goto LAB_00bd9db0;
      }
      else {
        fVar18 = *(float *)(puVar15 + 6);
        if ((fVar18 < *(float *)(puVar1 + 6)) ||
           (*(float *)(puVar1 + 8) <= fVar18 && fVar18 != *(float *)(puVar1 + 8)))
        goto LAB_00bd9db0;
      }
      local_54 = local_54 + 1;
      fVar18 = *(float *)(puVar1 + 2);
      fVar19 = *(float *)(puVar15 + 2);
      *(short *)(param_2 + 4) = *(short *)(param_2 + 4) + 1;
      local_64 = fVar18 * fVar19 + local_64;
    } while (local_54 != iVar4);
    if (0.0 < local_64) goto LAB_00bd9f6b;
LAB_00bd9db0:
    local_68 = 0.0;
  }
  iVar4 = _DAT_0105db00;
  if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
     (iVar12 = ThreadGetCurrentId(), iVar4 == iVar12)) {
    cVar10 = CVProfNode::ExitScope();
    if (cVar10 != '\0') {
      _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
    }
    DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
  }
  if (local_6c != 0) {
    (**(code **)(local_6c + 0x54))(local_6c,uVar7,uVar8,0,0,0);
  }
  return (longdouble)local_68;
}

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)