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