AI_CriteriaSet::InterceptWorldSetContexts
0x005a9e10 · 1010 bytes · __cdecl
_ZN14AI_CriteriaSet25InterceptWorldSetContextsEPS_S0_
Decompiled
undefined (2 params)
/* AI_CriteriaSet::InterceptWorldSetContexts(AI_CriteriaSet*, AI_CriteriaSet*) */
int AI_CriteriaSet::InterceptWorldSetContexts(AI_CriteriaSet *param_1,AI_CriteriaSet *param_2)
{
undefined2 uVar1;
undefined2 uVar2;
undefined2 uVar3;
undefined4 uVar4;
undefined4 uVar5;
undefined4 uVar6;
short sVar7;
void *pvVar8;
char *pcVar9;
undefined4 uVar10;
char *pcVar11;
int iVar12;
int in_GS_OFFSET;
byte bVar13;
undefined4 uVar14;
float local_a8;
undefined2 local_92;
code *local_90;
void *local_8c;
int local_88;
undefined4 local_84;
undefined2 local_80;
short local_7e;
undefined2 local_7c;
undefined2 local_7a;
undefined4 local_78;
undefined4 local_74;
char local_70 [80];
int local_20;
bVar13 = 0;
iVar12 = *(int *)(param_1 + 0x1c);
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (iVar12 == 0) {
iVar12 = 0;
}
else {
if ((*(int *)(param_2 + 8) < iVar12) && (-1 < *(int *)(param_2 + 0xc))) {
*(int *)(param_2 + 8) = iVar12;
if (*(void **)(param_2 + 4) == (void *)0x0) {
pvVar8 = malloc(iVar12 * 0x50);
*(void **)(param_2 + 4) = pvVar8;
}
else {
pvVar8 = realloc(*(void **)(param_2 + 4),iVar12 * 0x50);
*(void **)(param_2 + 4) = pvVar8;
}
}
local_84 = 0;
local_90 = CritEntry_t::LessFunc;
pcVar9 = local_70;
for (iVar12 = 0x14; iVar12 != 0; iVar12 = iVar12 + -1) {
pcVar9[0] = '\0';
pcVar9[1] = '\0';
pcVar9[2] = '\0';
pcVar9[3] = '\0';
pcVar9 = pcVar9 + ((uint)bVar13 * -2 + 1) * 4;
}
local_70[0] = 'w';
local_80 = 0xffff;
local_7e = 0;
local_7c = 0xffff;
local_7a = 0xffff;
local_70[1] = 0x6f;
local_70[2] = 0x72;
local_70[3] = 0x6c;
iVar12 = *(short *)(param_1 + 0x12) + 1;
local_70[4] = 100;
local_8c = (void *)0x0;
local_88 = 0;
local_78 = 0;
local_74 = 0;
if (0 < iVar12) {
local_88 = iVar12;
local_8c = malloc(iVar12 * 0x50);
}
sVar7 = CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
::FirstInorder((CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
*)param_1);
iVar12 = (int)sVar7;
sVar7 = *(short *)(param_1 + 0x12);
if ((-1 < iVar12) && (iVar12 < sVar7)) {
do {
/* try { // try from 005a9f5f to 005aa1ae has its CatchHandler @ 005aa219 */
pcVar9 = (char *)GetName(param_1,iVar12);
if (*pcVar9 == '$') {
V_strncpy(local_70 + 5,pcVar9 + 1,0x4b);
if (iVar12 < *(short *)(param_1 + 0x12)) {
local_a8 = *(float *)(iVar12 * 0x50 + *(int *)(param_1 + 4) + 0x4c);
}
else {
local_a8 = 1.0;
}
pcVar11 = (char *)GetValue(param_1,iVar12);
AppendCriteria((AI_CriteriaSet *)&local_90,local_70,pcVar11,local_a8);
if (iVar12 < *(short *)(param_1 + 0x12)) {
local_a8 = *(float *)(iVar12 * 0x50 + *(int *)(param_1 + 4) + 0x4c);
}
else {
local_a8 = 1.0;
}
pcVar11 = (char *)GetValue(param_1,iVar12);
AppendCriteria(param_2,pcVar9 + 1,pcVar11,local_a8);
local_70[5] = 0;
}
else {
if (iVar12 < *(short *)(param_1 + 0x12)) {
uVar14 = *(undefined4 *)(iVar12 * 0x50 + *(int *)(param_1 + 4) + 0x4c);
uVar10 = GetValue(param_1,iVar12);
local_92 = *(undefined2 *)(iVar12 * 0x50 + *(int *)(param_1 + 4) + 8);
}
else {
uVar10 = GetValue(param_1,iVar12);
uVar14 = 0x3f800000;
local_92 = 0xffff;
}
AppendCriteria((AI_CriteriaSet *)&local_90,&local_92,uVar10,uVar14);
}
sVar7 = CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
::NextInorder((CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
*)param_1,(short)iVar12);
iVar12 = (int)sVar7;
sVar7 = *(short *)(param_1 + 0x12);
} while ((-1 < iVar12) && (iVar12 < sVar7));
}
uVar14 = *(undefined4 *)(param_1 + 0xc);
*(undefined4 *)(param_1 + 0x1c) = 0;
uVar10 = *(undefined4 *)(param_1 + 4);
*(undefined4 *)(param_1 + 0xc) = local_84;
uVar4 = *(undefined4 *)(param_1 + 8);
*(void **)(param_1 + 4) = local_8c;
uVar5 = *(undefined4 *)param_1;
*(int *)(param_1 + 8) = local_88;
uVar1 = *(undefined2 *)(param_1 + 0x10);
*(code **)param_1 = local_90;
uVar2 = *(undefined2 *)(param_1 + 0x14);
*(undefined2 *)(param_1 + 0x10) = local_80;
*(short *)(param_1 + 0x12) = local_7e;
uVar6 = *(undefined4 *)(param_1 + 0x18);
*(undefined2 *)(param_1 + 0x14) = local_7c;
uVar3 = *(undefined2 *)(param_1 + 0x16);
*(undefined4 *)(param_1 + 0x18) = local_78;
*(undefined2 *)(param_1 + 0x16) = local_7a;
iVar12 = (int)*(short *)(param_2 + 0x12);
local_90 = (code *)uVar5;
local_8c = (void *)uVar10;
local_88 = uVar4;
local_84 = uVar14;
local_80 = uVar1;
local_7e = sVar7;
local_7c = uVar2;
local_7a = uVar3;
local_78 = uVar6;
CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
::RemoveAll((CUtlRBTree<AI_CriteriaSet::CritEntry_t,short,bool(*)(AI_CriteriaSet::CritEntry_t_const&,AI_CriteriaSet::CritEntry_t_const&),CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>>
*)&local_90);
local_7c = 0xffff;
CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>::Purge
((CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short> *)&local_8c);
local_7a = 0xffff;
CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short>::Purge
((CUtlMemory<UtlRBTreeNode_t<AI_CriteriaSet::CritEntry_t,short>,short> *)&local_8c);
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return iVar12;
}
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.