L L4D2node

Templates_ReconnectIOForGroup

0x0083dff0 · 1935 bytes · __cdecl

_Z29Templates_ReconnectIOForGroupP14CPointTemplate

Decompiled

undefined (1 param)

/* Templates_ReconnectIOForGroup(CPointTemplate*) */

void Templates_ReconnectIOForGroup(CPointTemplate *param_1)

{
  int *piVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  undefined4 uVar4;
  CEntityMapData *pCVar5;
  char cVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  int in_GS_OFFSET;
  CUtlMemory<grouptemplate_t,int> *local_20a0;
  int local_209c;
  int local_2094;
  int local_2090;
  char *local_208c;
  char *local_2080;
  char *local_2074 [2];
  char *local_206c;
  undefined4 local_2068;
  int local_2064;
  undefined4 local_2060;
  undefined4 local_205c;
  int local_2058;
  int local_2054;
  code *local_2050;
  int local_204c;
  undefined4 local_2048;
  undefined4 local_2044;
  int local_2040;
  undefined4 local_203c;
  undefined4 local_2038;
  undefined4 local_2034;
  undefined4 local_2030;
  char local_202c [2048];
  char local_182c [2048];
  char local_102c [2048];
  CEntityMapData *local_82c;
  char local_828 [2048];
  int local_28;
  undefined1 local_24;
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  iVar7 = CPointTemplate::GetNumTemplates(param_1);
  if (iVar7 == 0) goto LAB_0083e01d;
  local_2064 = 0;
  local_2060 = 0;
  local_205c = 0;
  local_2058 = 0;
  local_2054 = 0;
  if (0 < iVar7) {
    iVar10 = 0;
    do {
                    /* try { // try from 0083e085 to 0083e118 has its CatchHandler @ 0083e78c */
      local_28 = CPointTemplate::GetTemplateIndexForTemplate(param_1,iVar10);
      iVar8 = *(int *)(g_Templates + local_28 * 4);
      uVar3 = *(undefined4 *)(iVar8 + 4);
      uVar4 = *(undefined4 *)(iVar8 + 0xc);
      local_82c = operator_new(0xc);
      *(undefined4 *)local_82c = uVar3;
      *(undefined4 *)(local_82c + 8) = uVar3;
      *(undefined4 *)(local_82c + 4) = uVar4;
      CEntityMapData::ExtractValue(local_82c,"targetname",local_828);
      local_24 = 0;
      CUtlVector<grouptemplate_t,CUtlMemory<grouptemplate_t,int>>::InsertBefore
                ((CUtlVector<grouptemplate_t,CUtlMemory<grouptemplate_t,int>> *)&local_2064,
                 local_2058,(grouptemplate_t *)&local_82c);
      iVar10 = iVar10 + 1;
    } while (iVar10 != iVar7);
  }
  local_20a0 = (CUtlMemory<grouptemplate_t,int> *)&local_2064;
  cVar6 = CPointTemplate::AllowNameFixup(param_1);
  if (cVar6 == '\0') {
LAB_0083e70d:
    iVar8 = 0;
    iVar10 = 0;
    if (0 < iVar7) {
      do {
        iVar10 = iVar10 + 1;
        puVar2 = (undefined4 *)(local_2064 + iVar8);
        iVar8 = iVar8 + 0x80c;
        operator_delete((void *)*puVar2);
      } while (iVar10 != iVar7);
    }
  }
  else if (0 < iVar7) {
    local_2094 = 0;
    local_209c = 0;
    do {
      local_204c = 0;
      local_2048 = 0;
      local_2044 = 0;
      local_2040 = -1;
      local_203c = 0;
      local_2038 = 0xffffffff;
      local_2034 = 0xffffffff;
      local_2030 = 0;
      local_2050 = CaselessStringLessThan;
      pCVar5 = *(CEntityMapData **)(local_2064 + local_2094);
                    /* try { // try from 0083e1c9 to 0083e581 has its CatchHandler @ 0083e7d3 */
      cVar6 = CEntityMapData::GetFirstKey(pCVar5,local_202c,local_182c);
      while (cVar6 != '\0') {
        iVar10 = _V_stricmp(local_202c,"targetname");
        if (iVar10 != 0) {
          local_2074[0] = local_202c;
          if (local_2040 != -1) {
            iVar10 = local_2040;
            do {
              while( true ) {
                local_2090 = iVar10 * 0x18;
                cVar6 = (*local_2050)(local_2074,local_204c + 0x10 + local_2090);
                if (cVar6 != '\0') break;
                cVar6 = (*local_2050)(local_204c + local_2090 + 0x10,local_2074);
                if (cVar6 == '\0') goto LAB_0083e2ea;
                if ((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                     ::Links(int)::s_Sentinel == '\0') &&
                   (iVar10 = __cxa_guard_acquire(&CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                                                  ::Links(int)::s_Sentinel), iVar10 != 0)) {
                  CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                  ::Links(int)::s_Sentinel = 0xffffffff;
                  DAT_00f14aec = 0xffffffff;
                  DAT_00f14af0 = 0xffffffff;
                  __cxa_guard_release(&CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                                       ::Links(int)::s_Sentinel);
                }
                iVar10 = *(int *)(local_204c + 4 + local_2090);
                if (iVar10 == -1) goto LAB_0083e2a8;
              }
              if ((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                   ::Links(int)::s_Sentinel == '\0') &&
                 (iVar8 = __cxa_guard_acquire(&CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                                               ::Links(int)::s_Sentinel), iVar8 != 0)) {
                CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                ::Links(int)::s_Sentinel = 0xffffffff;
                DAT_00f14aec = 0xffffffff;
                DAT_00f14af0 = 0xffffffff;
                __cxa_guard_release(&CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                                     ::Links(int)::s_Sentinel);
              }
              iVar10 = *(int *)(local_204c + iVar10 * 0x18);
            } while (iVar10 != -1);
          }
LAB_0083e2a8:
          local_206c = strdup(local_202c);
          local_2068 = 0;
          local_2090 = CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                       ::Insert((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                                 *)&local_2050,(Node_t *)&local_206c);
          local_2090 = local_2090 * 0x18;
LAB_0083e2ea:
          piVar1 = (int *)(local_2090 + local_204c + 0x14);
          *piVar1 = *piVar1 + 1;
          local_208c = strchr(local_182c,0x1b);
          if ((local_208c == (char *)0x0) &&
             (local_208c = strchr(local_182c,0x2c), local_208c == (char *)0x0)) {
            local_2080 = local_182c;
          }
          else {
            V_strncpy(local_102c,local_182c,(int)(local_208c + (1 - (int)local_182c)));
            local_2080 = local_102c;
          }
          iVar10 = 0;
          do {
            iVar8 = _V_stricmp((char *)(local_2064 + iVar10 * 0x80c + 4),local_2080);
            if (iVar8 == 0) {
              if (*(int *)(template_debug._28_4_ + 0x30) != 0) {
                Msg("Template Connection Found: Key %s (\"%s\") in entity named \"%s\"(%d) matches entity %d\'s targetname\n"
                    ,local_202c,local_2080,local_2094 + local_2064 + 4,local_209c,iVar10);
              }
              iVar8 = *(int *)(local_204c + 0x14 + local_2090);
              if (local_208c == (char *)0x0) {
                    /* try { // try from 0083e6ad to 0083e6d2 has its CatchHandler @ 0083e7d3 */
                V_strncpy((char *)&local_82c,local_2080,0x800);
                V_strncat((char *)&local_82c,ENTITYIO_FIXUP_STRING,0x800,-1);
              }
              else {
                V_strncpy((char *)&local_82c,local_102c,0x800);
                V_strncat((char *)&local_82c,ENTITYIO_FIXUP_STRING,0x800,-1);
                V_strncat((char *)&local_82c,local_208c,0x800,-1);
              }
              CEntityMapData::SetValue(pCVar5,local_202c,(char *)&local_82c,iVar8 + -1);
              iVar8 = g_Templates;
              iVar9 = iVar10 * 0x80c + local_2064;
              *(undefined1 *)(iVar9 + 0x808) = 1;
              *(undefined1 *)
               (*(int *)(iVar8 + *(int *)(local_2064 + 0x804 + local_2094) * 4) + 0x10) = 1;
              *(undefined1 *)(*(int *)(iVar8 + *(int *)(iVar9 + 0x804) * 4) + 0x10) = 1;
            }
            iVar10 = iVar10 + 1;
          } while (iVar10 != iVar7);
        }
        cVar6 = CEntityMapData::GetNextKey(pCVar5,local_202c,local_182c);
      }
      CUtlDict<int,int>::RemoveAll((CUtlDict<int,int> *)&local_2050);
      CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
      ::RemoveAll((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
                   *)&local_2050);
      local_2038 = 0xffffffff;
      CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>::Purge
                ((CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int> *)
                 &local_204c);
      local_2034 = 0xffffffff;
      CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>::Purge
                ((CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int> *)
                 &local_204c);
      local_209c = local_209c + 1;
      local_2094 = local_2094 + 0x80c;
    } while (local_209c != iVar7);
    iVar10 = 0;
    iVar8 = 0;
    do {
      if (*(char *)((undefined4 *)(local_2064 + iVar10) + 0x202) != '\0') {
        pCVar5 = *(CEntityMapData **)(local_2064 + iVar10);
                    /* try { // try from 0083e645 to 0083e68c has its CatchHandler @ 0083e78c */
        CEntityMapData::ExtractValue(pCVar5,"targetname",(char *)&local_82c);
        V_strncat((char *)&local_82c,ENTITYIO_FIXUP_STRING,0x800,-1);
        CEntityMapData::SetValue(pCVar5,"targetname",(char *)&local_82c,0);
      }
      iVar8 = iVar8 + 1;
      iVar10 = iVar10 + 0x80c;
    } while (iVar8 != iVar7);
    goto LAB_0083e70d;
  }
  local_2058 = 0;
  CUtlMemory<grouptemplate_t,int>::Purge(local_20a0);
  local_2058 = 0;
  local_2054 = local_2064;
  CUtlMemory<grouptemplate_t,int>::Purge(local_20a0);
  local_2054 = local_2064;
  CUtlMemory<grouptemplate_t,int>::Purge(local_20a0);
LAB_0083e01d:
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}

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)