AI_CriteriaSet::Describe
0x005aa3e0 · 848 bytes · __thiscall
_ZNK14AI_CriteriaSet8DescribeER10CUtlBuffer
Decompiled
undefined (2 params)
/* AI_CriteriaSet::Describe(CUtlBuffer&) const */
void __thiscall AI_CriteriaSet::Describe(AI_CriteriaSet *this,CUtlBuffer *param_1)
{
undefined4 uVar1;
short sVar2;
ushort uVar3;
int iVar4;
ushort *puVar5;
ushort uVar6;
int iVar7;
uint uVar8;
undefined2 local_42;
undefined4 local_40;
int local_3c;
code *local_38;
void *local_34;
int local_30;
undefined4 local_2c;
ushort local_28;
undefined2 local_26;
ushort local_24;
ushort local_22;
void *local_20;
local_38 = CaselessStringLessThan;
local_34 = (void *)0x0;
local_2c = 0;
local_30 = (int)*(short *)(this + 0x12);
if (local_30 != 0) {
local_34 = malloc(local_30 << 4);
}
local_28 = 0xffff;
local_26 = 0;
local_24 = 0xffff;
local_22 = 0xffff;
local_20 = local_34;
sVar2 = 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>>
*)this);
uVar3 = local_28;
while (local_28 = uVar3, sVar2 != -1) {
iVar7 = sVar2 * 0x50 + *(int *)(this + 4);
local_42 = *(undefined2 *)(iVar7 + 8);
/* try { // try from 005aa47d to 005aa5e0 has its CatchHandler @ 005aa754 */
local_40 = CUtlSymbolTable::String((CUtlSymbolTable *)sm_CriteriaSymbols,&local_42);
local_3c = iVar7 + 8;
CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Insert((CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
*)&local_38,(Node_t *)&local_40);
sVar2 = 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>>
*)this,sVar2);
uVar3 = local_28;
}
do {
uVar8 = (uint)uVar3;
if ((CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel == '\0') &&
(iVar7 = __cxa_guard_acquire(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel), iVar7 != 0)) {
CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel = -1;
DAT_00f21a92 = 0xffff;
DAT_00f21a94 = 0xffff;
__cxa_guard_release(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
}
sVar2 = CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel;
if (uVar3 != 0xffff) {
sVar2 = *(short *)(uVar8 * 0x10 + (int)local_34);
}
if (sVar2 == -1) {
uVar6 = local_22;
while (local_22 = uVar6, uVar3 != 0xffff) {
uVar1 = *(undefined4 *)((int)local_34 + uVar8 * 0x10 + 8);
iVar7 = *(int *)((int)local_34 + uVar8 * 0x10 + 0xc);
if (*(float *)(iVar7 + 0x44) == 1.0) {
CUtlBuffer::Printf(param_1," %20s = \'%s\'\n",uVar1,iVar7 + 2);
}
else {
CUtlBuffer::Printf(param_1," %20s = \'%s\' (weight %f)\n",uVar1,iVar7 + 2,
(double)*(float *)(iVar7 + 0x44));
}
uVar3 = CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::NextInorder((CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
*)&local_38,(ushort)uVar8);
uVar8 = (uint)uVar3;
uVar6 = local_22;
}
if (uVar6 != 0xffff) {
iVar7 = 0;
if (0 < local_30) {
do {
uVar3 = (ushort)iVar7;
if ((iVar7 < local_30) && (uVar3 <= uVar6)) {
if ((CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel == '\0') &&
(iVar4 = __cxa_guard_acquire(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel), iVar4 != 0)) {
CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel = -1;
DAT_00f21a92 = 0xffff;
DAT_00f21a94 = 0xffff;
__cxa_guard_release(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
}
puVar5 = (ushort *)((int)local_34 + iVar7 * 0x10);
uVar6 = local_22;
if (uVar3 != *puVar5) {
puVar5[1] = local_24;
*(ushort *)((int)local_34 + iVar7 * 0x10) = uVar3;
local_24 = uVar3;
}
}
} while (((uVar3 != uVar6) && ((int)(iVar7 + 1U & 0xffff) < local_30)) &&
(iVar7 = iVar7 + 1, iVar7 != 0xffff));
}
local_28 = 0xffff;
local_26 = 0;
}
local_24 = 0xffff;
CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>
::Purge((CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>
*)&local_34);
local_22 = 0xffff;
CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>
::Purge((CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>
*)&local_34);
return;
}
if (CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel == '\0') {
iVar7 = __cxa_guard_acquire(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
if (iVar7 != 0) {
CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel = -1;
DAT_00f21a92 = 0xffff;
DAT_00f21a94 = 0xffff;
__cxa_guard_release(&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel);
}
if (uVar3 != 0xffff) goto LAB_005aa4f2;
LAB_005aa60d:
puVar5 = (ushort *)
&CUtlRBTree<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short,CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,AI_CriteriaSet::CritEntry_t_const*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
::Links(unsigned_short)::s_Sentinel;
}
else {
if (uVar3 == 0xffff) goto LAB_005aa60d;
LAB_005aa4f2:
puVar5 = (ushort *)(uVar8 * 0x10 + (int)local_34);
}
uVar3 = *puVar5;
} while( true );
}
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.