L L4D2node

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 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)