Mod_LoadNodes
0x00197be0 · 1038 bytes · unknown
_Z13Mod_LoadNodesv
Decompiled
undefined (0 params)
/* WARNING: Unknown calling convention -- yet parameter storage is locked */
/* Mod_LoadNodes() */
void Mod_LoadNodes(void)
{
short sVar1;
short sVar2;
int iVar3;
uint uVar4;
undefined1 *puVar5;
char *pcVar6;
mnode_t *pmVar7;
int iVar8;
ushort uVar9;
int iVar10;
Vector *pVVar11;
uint uVar12;
int *piVar13;
int in_GS_OFFSET;
float fVar14;
float fVar15;
float fVar16;
uint local_158;
int local_154;
mnode_t *local_150;
uint local_140 [3];
int local_134;
int *local_130;
int local_128;
undefined1 local_124 [260];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
CMapLoadHelper::CMapLoadHelper((CMapLoadHelper *)local_140,5);
if ((local_140[0] & 0x1f) != 0) {
/* try { // try from 00197fb5 to 00197fb9 has its CatchHandler @ 0019800a */
Host_Error("Mod_LoadNodes: funny lump size in %s",s_szMapPathName);
}
uVar4 = local_140[0] >> 5;
puVar5 = s_szMapPathName;
if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
puVar5 = local_124;
}
/* try { // try from 00197c63 to 00197e9b has its CatchHandler @ 0019800a */
pcVar6 = (char *)va("%s [%s]",puVar5,"nodes");
pmVar7 = (mnode_t *)Hunk_AllocName(uVar4 << 6,pcVar6,true);
iVar8 = s_pMap;
*(mnode_t **)(s_pMap + 0x50) = pmVar7;
*(uint *)(iVar8 + 0x4c) = uVar4;
if (uVar4 == 0) {
Mod_SetParent(pmVar7,(mnode_t *)0x0);
}
else {
local_158 = 0;
piVar13 = local_130;
local_150 = pmVar7;
do {
sVar1 = *(short *)((int)piVar13 + 0x12);
iVar3 = piVar13[5];
sVar2 = *(short *)((int)piVar13 + 0x16);
iVar10 = piVar13[3];
fVar15 = ((float)(int)*(short *)((int)piVar13 + 0xe) + (float)(int)(short)iVar3) * 0.5;
fVar14 = ((float)(int)(short)piVar13[4] + (float)(int)sVar2) * 0.5;
*(float *)(pmVar7 + (int)(local_150 + (0x14 - (int)pmVar7))) = fVar15;
fVar16 = ((float)(int)(short)iVar10 + (float)(int)sVar1) * 0.5;
*(float *)(pmVar7 + (int)(local_150 + (0x18 - (int)pmVar7))) = fVar14;
*(float *)(pmVar7 + (int)(local_150 + (0x10 - (int)pmVar7))) = fVar16;
*(float *)(pmVar7 + (int)(local_150 + (0x24 - (int)pmVar7))) =
(float)(int)(short)iVar3 - fVar15;
*(float *)(pmVar7 + (int)(local_150 + (0x28 - (int)pmVar7))) = (float)(int)sVar2 - fVar14;
*(float *)(pmVar7 + (int)(local_150 + (0x20 - (int)pmVar7))) = (float)(int)sVar1 - fVar16;
*(int *)(local_150 + 0x30) = *(int *)(iVar8 + 8) + *piVar13 * 0x14;
uVar9 = *(ushort *)(piVar13 + 6);
if (s_nMapSurfacesLoaded < (int)((uint)*(ushort *)((int)piVar13 + 0x1a) + (uint)uVar9)) {
Host_Error("Map %s is corrupted and cannot be loaded.",s_szMapPathName);
uVar9 = *(ushort *)(piVar13 + 6);
iVar8 = s_pMap;
}
iVar10 = 0;
*(ushort *)(local_150 + 0x3c) = uVar9;
*(undefined2 *)(local_150 + 0x3e) = *(undefined2 *)((int)piVar13 + 0x1a);
iVar3 = piVar13[7];
*(undefined4 *)local_150 = 0xffffffff;
*(short *)(local_150 + 0xc) = (short)iVar3;
do {
uVar12 = piVar13[iVar10 + 1];
if ((int)uVar12 < 0) {
uVar12 = ~uVar12;
puVar5 = s_szMapPathName;
if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
puVar5 = local_124;
}
local_154 = *(int *)(iVar8 + 0x10);
if (*(int *)(iVar8 + 0xc) <= (int)uVar12) goto LAB_00197e27;
}
else {
puVar5 = s_szMapPathName;
if ((&s_MapLumpFiles)[local_128 * 7] != 0) {
puVar5 = local_124;
}
local_154 = *(int *)(iVar8 + 0x50);
if (*(int *)(iVar8 + 0x4c) <= (int)uVar12) {
LAB_00197e27:
Sys_Error("Couldn\'t load corrupted map %s",puVar5);
iVar8 = s_pMap;
}
}
*(uint *)(local_150 + iVar10 * 4 + 0x34) = local_154 + uVar12 * 0x40;
iVar10 = iVar10 + 1;
} while (iVar10 != 2);
local_158 = local_158 + 1;
piVar13 = piVar13 + 8;
local_150 = local_150 + 0x40;
} while (uVar4 != local_158);
uVar12 = 0;
Mod_SetParent(*(mnode_t **)(iVar8 + 0x50),(mnode_t *)0x0);
pVVar11 = (Vector *)(*(int *)(iVar8 + 0x50) + 0x20);
do {
while (*(int *)(pVVar11 + -0x20) != -1) {
LAB_00197ef0:
uVar12 = uVar12 + 1;
pVVar11 = pVVar11 + 0x40;
if (uVar4 == uVar12) goto LAB_00197f50;
}
if (((*(float *)pVVar11 <= 50.0) && (*(float *)(pVVar11 + 4) <= 50.0)) &&
(*(float *)(pVVar11 + 8) <= 50.0)) {
MarkSmallNode(*(mnode_t **)(pVVar11 + 0x14));
MarkSmallNode(*(mnode_t **)(pVVar11 + 0x18));
goto LAB_00197ef0;
}
if (*(int *)*(mnode_t **)(pVVar11 + 0x14) < 0) {
CheckSmallVolumeDifferences(*(mnode_t **)(pVVar11 + 0x14),pVVar11);
}
if (-1 < *(int *)*(mnode_t **)(pVVar11 + 0x18)) goto LAB_00197ef0;
uVar12 = uVar12 + 1;
CheckSmallVolumeDifferences(*(mnode_t **)(pVVar11 + 0x18),pVVar11);
pVVar11 = pVVar11 + 0x40;
} while (uVar4 != uVar12);
}
LAB_00197f50:
if (local_134 != 0) {
(**(code **)(*g_pFileSystem + 0x150))(g_pFileSystem,local_134);
}
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
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.