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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.