COverlayMgr::LoadOverlays
0x001d4410 · 2516 bytes · __thiscall
_ZN11COverlayMgr12LoadOverlaysEv
Decompiled
undefined (1 param)
/* COverlayMgr::LoadOverlays() */
undefined4 __thiscall COverlayMgr::LoadOverlays(COverlayMgr *this)
{
int iVar1;
int iVar2;
float fVar3;
float fVar4;
float fVar5;
ushort uVar6;
uint uVar7;
undefined2 uVar8;
int iVar9;
uint uVar10;
int iVar11;
uint uVar12;
int iVar13;
int iVar14;
undefined4 uVar15;
uint *puVar16;
int *piVar17;
int iVar18;
int in_GS_OFFSET;
float fVar19;
float fVar20;
float fVar21;
float fVar22;
float fVar23;
float fVar24;
undefined1 *local_4c4;
float *local_4c0;
uint local_4b4;
CMapLoadHelper local_4a0 [288];
CMapLoadHelper local_380 [288];
CMapLoadHelper local_260 [288];
CMapLoadHelper local_140 [288];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
CMapLoadHelper::CMapLoadHelper(local_4a0,0x2d);
/* try { // try from 001d4457 to 001d445b has its CatchHandler @ 001d4e41 */
CMapLoadHelper::CMapLoadHelper(local_380,0x32);
/* try { // try from 001d446d to 001d4471 has its CatchHandler @ 001d4e3d */
CMapLoadHelper::CMapLoadHelper(local_260,0x3c);
/* try { // try from 001d4483 to 001d4487 has its CatchHandler @ 001d4e39 */
CMapLoadHelper::CMapLoadHelper(local_140,0x3d);
/* try { // try from 001d4491 to 001d4dca has its CatchHandler @ 001d4df7 */
iVar9 = CMapLoadHelper::LumpBase(local_4a0);
uVar10 = CMapLoadHelper::LumpSize(local_4a0);
if (uVar10 == (uVar10 / 0x160) * 0x160) {
iVar11 = CMapLoadHelper::LumpBase(local_380);
uVar10 = CMapLoadHelper::LumpSize(local_380);
if (uVar10 == (uVar10 / 0x460) * 0x460) {
local_4c0 = (float *)CMapLoadHelper::LumpBase(local_260);
uVar10 = CMapLoadHelper::LumpSize(local_260);
if ((uVar10 & 7) == 0) {
local_4c4 = (undefined1 *)CMapLoadHelper::LumpBase(local_140);
uVar10 = CMapLoadHelper::LumpSize(local_140);
if ((uVar10 & 3) == 0) {
uVar10 = CMapLoadHelper::LumpSize(local_4a0);
uVar10 = uVar10 / 0x160;
uVar12 = CMapLoadHelper::LumpSize(local_380);
uVar12 = uVar12 / 0x460;
CUtlVector<moverlay_t,CUtlMemory<moverlay_t,int>>::SetCount
((CUtlVector<moverlay_t,CUtlMemory<moverlay_t,int>> *)(this + 0x28),
uVar10 + uVar12);
if (uVar10 != 0) {
local_4b4 = 0;
iVar18 = iVar9;
do {
puVar16 = (uint *)(local_4b4 * 0xa8 + *(int *)(this + 0x28));
if (local_4c4 != (undefined1 *)0x0) {
*(undefined1 *)(puVar16 + 0x29) = *local_4c4;
*(undefined1 *)((int)puVar16 + 0xa5) = local_4c4[1];
*(undefined1 *)((int)puVar16 + 0xa6) = local_4c4[2];
*(undefined1 *)((int)puVar16 + 0xa7) = local_4c4[3];
local_4c4 = local_4c4 + 4;
}
*puVar16 = local_4b4;
uVar8 = CMapLoadHelper::BoundsCheck_texinfo(local_4a0,(int)*(short *)(iVar18 + 4));
*(undefined2 *)(puVar16 + 1) = uVar8;
*(short *)((int)puVar16 + 6) = (short)((int)(uint)*(ushort *)(iVar18 + 6) >> 0xe);
puVar16[8] = *(uint *)(iVar18 + 0x108);
puVar16[9] = *(uint *)(iVar18 + 0x10c);
puVar16[10] = *(uint *)(iVar18 + 0x110);
puVar16[0xb] = *(uint *)(iVar18 + 0x114);
if (local_4c0 == (float *)0x0) {
puVar16[0x25] = 0xbf800000;
puVar16[0x26] = 0;
puVar16[0x27] = 0x3f800000;
}
else {
puVar16[0x25] = (uint)*local_4c0;
puVar16[0x26] = (uint)local_4c0[1];
puVar16[0x27] = (uint)(1.0 / (local_4c0[1] - *local_4c0));
local_4c0 = local_4c0 + 2;
}
fVar3 = *(float *)(iVar18 + 0x148);
puVar16[0x18] = (uint)fVar3;
iVar13 = iVar18 - iVar9;
fVar4 = *(float *)(iVar13 + 0x14c + iVar9);
puVar16[0x19] = (uint)fVar4;
fVar5 = *(float *)(iVar13 + 0x150 + iVar9);
puVar16[0x1a] = (uint)fVar5;
puVar16[0xc] = *(uint *)(iVar18 + 0x118);
puVar16[0xd] = *(uint *)(iVar13 + 0x11c + iVar9);
fVar20 = *(float *)(iVar13 + 0x120 + iVar9);
puVar16[0xe] = (uint)fVar20;
puVar16[0xf] = *(uint *)(iVar18 + 0x124);
puVar16[0x10] = *(uint *)(iVar13 + 0x128 + iVar9);
fVar19 = *(float *)(iVar13 + 300 + iVar9);
puVar16[0x11] = (uint)fVar19;
puVar16[0x12] = *(uint *)(iVar18 + 0x130);
puVar16[0x13] = *(uint *)(iVar13 + 0x134 + iVar9);
fVar21 = *(float *)(iVar13 + 0x138 + iVar9);
puVar16[0x14] = (uint)fVar21;
puVar16[0x15] = *(uint *)(iVar18 + 0x13c);
puVar16[0x16] = *(uint *)(iVar13 + 0x140 + iVar9);
puVar16[0x17] = *(uint *)(iVar13 + 0x144 + iVar9);
fVar24 = *(float *)(iVar18 + 0x154);
puVar16[0x21] = (uint)fVar24;
fVar23 = *(float *)(iVar13 + 0x158 + iVar9);
puVar16[0x22] = (uint)fVar23;
fVar22 = *(float *)(iVar13 + 0x15c + iVar9);
puVar16[0x1b] = (uint)fVar20;
puVar16[0x1c] = (uint)fVar19;
puVar16[0x23] = (uint)fVar22;
puVar16[0x1d] = (uint)fVar21;
if (fVar20 == 0.0) {
if (fVar19 == 0.0) {
if (fVar21 == 0.0) {
Warning("Bad overlay basis at (%f %f %f)!\n",(double)fVar3,(double)fVar4,
(double)fVar5);
fVar23 = (float)puVar16[0x22];
fVar21 = (float)puVar16[0x1d];
fVar22 = (float)puVar16[0x23];
fVar19 = (float)puVar16[0x1c];
fVar20 = (float)puVar16[0x1b];
fVar24 = (float)puVar16[0x21];
}
else {
fVar20 = 0.0;
fVar19 = 0.0;
}
}
else {
fVar20 = 0.0;
}
}
puVar16[0x1e] = (uint)(fVar21 * fVar23 - fVar19 * fVar22);
puVar16[0x1f] = (uint)(fVar22 * fVar20 - fVar21 * fVar24);
puVar16[0x20] = (uint)(fVar19 * fVar24 - fVar20 * fVar23);
VectorNormalize((Vector *)(puVar16 + 0x1e));
puVar16[0xe] = 0;
puVar16[0x11] = 0;
puVar16[0x14] = 0;
uVar6 = *(ushort *)(iVar18 + 6);
puVar16[6] = 0;
if ((uVar6 & 0x3fff) != 0) {
CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>>::GrowVector
((CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>> *)(puVar16 + 3),
uVar6 & 0x3fff);
CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>>::ShiftElementsRight
((CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>> *)(puVar16 + 3),0,
uVar6 & 0x3fff);
}
iVar13 = 0;
if ((*(ushort *)(iVar18 + 6) & 0x3fff) != 0) {
do {
uVar7 = puVar16[3];
iVar1 = iVar13 * 4;
iVar14 = CMapLoadHelper::GetMap();
iVar2 = iVar13 * 4;
iVar13 = iVar13 + 1;
*(int *)(uVar7 + iVar1) =
*(int *)(iVar18 + 8 + iVar2) * 0x20 + *(int *)(iVar14 + 0x78);
} while (iVar13 < (int)(*(ushort *)(iVar18 + 6) & 0x3fff));
}
local_4b4 = local_4b4 + 1;
iVar18 = iVar18 + 0x160;
*(undefined2 *)(puVar16 + 2) = 0xffff;
puVar16[0x24] = 0;
} while (uVar10 != local_4b4);
}
if (uVar12 != 0) {
local_4b4 = 0;
local_4c0 = (float *)(uVar10 * 0xa8);
iVar9 = iVar11;
do {
piVar17 = (int *)((int)local_4c0 + *(int *)(this + 0x28));
*piVar17 = local_4b4 + uVar10;
uVar8 = CMapLoadHelper::BoundsCheck_texinfo(local_380,(int)*(short *)(iVar9 + 4));
*(undefined2 *)(piVar17 + 1) = uVar8;
*(short *)((int)piVar17 + 6) = (short)((int)(uint)*(ushort *)(iVar9 + 6) >> 0xe);
iVar18 = iVar9 - iVar11;
piVar17[8] = *(int *)(iVar9 + 0x408);
piVar17[9] = *(int *)(iVar9 + 0x40c);
piVar17[10] = *(int *)(iVar9 + 0x410);
piVar17[0xb] = *(int *)(iVar9 + 0x414);
fVar3 = *(float *)(iVar9 + 0x448);
piVar17[0x18] = (int)fVar3;
fVar4 = *(float *)(iVar18 + 0x44c + iVar11);
piVar17[0x19] = (int)fVar4;
fVar5 = *(float *)(iVar18 + 0x450 + iVar11);
piVar17[0x1a] = (int)fVar5;
piVar17[0xc] = *(int *)(iVar9 + 0x418);
piVar17[0xd] = *(int *)(iVar18 + 0x41c + iVar11);
fVar20 = *(float *)(iVar18 + 0x420 + iVar11);
piVar17[0xe] = (int)fVar20;
piVar17[0xf] = *(int *)(iVar9 + 0x424);
piVar17[0x10] = *(int *)(iVar18 + 0x428 + iVar11);
fVar19 = *(float *)(iVar18 + 0x42c + iVar11);
piVar17[0x11] = (int)fVar19;
piVar17[0x12] = *(int *)(iVar9 + 0x430);
piVar17[0x13] = *(int *)(iVar18 + 0x434 + iVar11);
fVar21 = *(float *)(iVar18 + 0x438 + iVar11);
piVar17[0x14] = (int)fVar21;
piVar17[0x15] = *(int *)(iVar9 + 0x43c);
piVar17[0x16] = *(int *)(iVar18 + 0x440 + iVar11);
piVar17[0x17] = *(int *)(iVar18 + 0x444 + iVar11);
fVar24 = *(float *)(iVar9 + 0x454);
piVar17[0x21] = (int)fVar24;
fVar23 = *(float *)(iVar18 + 0x458 + iVar11);
piVar17[0x22] = (int)fVar23;
fVar22 = *(float *)(iVar18 + 0x45c + iVar11);
piVar17[0x1b] = (int)fVar20;
piVar17[0x1c] = (int)fVar19;
piVar17[0x23] = (int)fVar22;
piVar17[0x1d] = (int)fVar21;
if (fVar20 == 0.0) {
if (fVar19 == 0.0) {
if (fVar21 == 0.0) {
Warning("Bad overlay basis at (%f %f %f)!\n",(double)fVar3,(double)fVar4,
(double)fVar5);
fVar23 = (float)piVar17[0x22];
fVar21 = (float)piVar17[0x1d];
fVar22 = (float)piVar17[0x23];
fVar19 = (float)piVar17[0x1c];
fVar20 = (float)piVar17[0x1b];
fVar24 = (float)piVar17[0x21];
}
else {
fVar20 = 0.0;
fVar19 = 0.0;
}
}
else {
fVar20 = 0.0;
}
}
piVar17[0x1e] = (int)(fVar21 * fVar23 - fVar19 * fVar22);
piVar17[0x1f] = (int)(fVar22 * fVar20 - fVar21 * fVar24);
piVar17[0x20] = (int)(fVar19 * fVar24 - fVar20 * fVar23);
VectorNormalize((Vector *)(piVar17 + 0x1e));
piVar17[0xe] = 0;
piVar17[0x11] = 0;
piVar17[0x14] = 0;
uVar6 = *(ushort *)(iVar9 + 6);
piVar17[6] = 0;
if ((uVar6 & 0x3fff) != 0) {
CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>>::GrowVector
((CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>> *)(piVar17 + 3),
uVar6 & 0x3fff);
CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>>::ShiftElementsRight
((CUtlVector<msurface2_t*,CUtlMemory<msurface2_t*,int>> *)(piVar17 + 3),0,
uVar6 & 0x3fff);
}
iVar18 = 0;
if ((*(ushort *)(iVar9 + 6) & 0x3fff) != 0) {
do {
iVar2 = piVar17[3];
iVar13 = iVar18 * 4;
iVar14 = CMapLoadHelper::GetMap();
iVar1 = iVar18 * 4;
iVar18 = iVar18 + 1;
*(int *)(iVar2 + iVar13) =
*(int *)(iVar9 + 8 + iVar1) * 0x20 + *(int *)(iVar14 + 0x78);
} while (iVar18 < (int)(*(ushort *)(iVar9 + 6) & 0x3fff));
}
local_4b4 = local_4b4 + 1;
iVar9 = iVar9 + 0x460;
local_4c0 = (float *)((int)local_4c0 + 0xa8);
*(undefined2 *)(piVar17 + 2) = 0xffff;
piVar17[0x24] = 0;
} while (uVar12 != local_4b4);
}
uVar15 = 1;
goto LAB_001d44fa;
}
}
}
}
uVar15 = 0;
LAB_001d44fa:
CMapLoadHelper::~CMapLoadHelper(local_140);
CMapLoadHelper::~CMapLoadHelper(local_260);
CMapLoadHelper::~CMapLoadHelper(local_380);
CMapLoadHelper::~CMapLoadHelper(local_4a0);
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return uVar15;
}
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.