CServerGameClients::ClientSetupVisibility
0x006cba80 · 1363 bytes · __thiscall
_ZN18CServerGameClients21ClientSetupVisibilityEP7edict_tS1_Phi
Decompiled
undefined (5 params)
/* WARNING: Type propagation algorithm not settling */
/* CServerGameClients::ClientSetupVisibility(edict_t*, edict_t*, unsigned char*, int) */
void __thiscall
CServerGameClients::ClientSetupVisibility
(CServerGameClients *this,edict_t *param_1,edict_t *param_2,uchar *param_3,int param_4)
{
byte *pbVar1;
ushort uVar2;
uint *puVar3;
int *piVar4;
code *pcVar5;
undefined4 *puVar6;
char cVar7;
int *piVar8;
uint uVar9;
uint uVar10;
int iVar11;
uint uVar12;
int **ppiVar13;
int **ppiVar14;
int in_GS_OFFSET;
longdouble lVar15;
int aiStack_10ac [3];
int *local_10a0 [3];
int local_1094;
int *local_108c;
uint *local_1088;
float local_1084;
undefined4 *local_1080;
uint local_1070;
undefined4 local_106c;
undefined4 local_1068;
uint local_1064;
undefined4 local_1060;
undefined4 local_105c;
uint local_1058;
undefined4 local_1054;
undefined4 local_1050;
undefined4 local_104c;
undefined4 local_1048;
undefined4 local_1044;
int *local_1040;
undefined4 local_103c;
int local_1038 [512];
uint local_838 [512];
byte local_38 [24];
int local_20;
ppiVar14 = local_10a0 + 1;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_10a0[1] = engine;
local_1094 = param_4;
local_10a0[2] = (int *)param_3;
local_10a0[0] = (int *)0x6cbabb;
(**(code **)(*engine + 0xec))();
local_10a0[1] = (int *)g_pToolFrameworkServer;
local_10a0[0] = (int *)0x6cbac7;
(**(code **)*g_pToolFrameworkServer)();
if ((param_1 == (edict_t *)0x0) || (puVar3 = *(uint **)(param_1 + 0xc), puVar3 == (uint *)0x0)) {
piVar8 = (int *)0x0;
}
else {
local_10a0[0] = (int *)0x6cbae2;
local_10a0[1] = (int *)puVar3;
piVar8 = (int *)(**(code **)(*puVar3 + 0x18))();
ppiVar14 = local_10a0 + 1;
if (piVar8 != (int *)0x0) {
local_10a0[1] = (int *)local_838;
local_10a0[0] = (int *)0x6cbafd;
local_10a0[2] = piVar8;
(**(code **)(*piVar8 + 0x234))();
local_10a0[1] = (int *)&local_1070;
ppiVar14 = local_10a0;
local_1070 = local_838[0];
local_106c = local_838[1];
local_1068 = local_838[2];
local_10a0[0] = engine;
(**(code **)(*engine + 0xf0))();
}
}
local_104c = 0;
local_1048 = 0;
local_1044 = 0;
local_1040 = (int *)0x0;
local_103c = 0;
if ((param_2 != (edict_t *)0x0) && (piVar4 = *(int **)(param_2 + 0xc), piVar4 != (int *)0x0)) {
iVar11 = *piVar4;
*ppiVar14 = piVar4;
local_1080 = &local_104c;
/* try { // try from 006cbba0 to 006cbfba has its CatchHandler @ 006cbfe1 */
pcVar5 = *(code **)(iVar11 + 0x18);
ppiVar14[-1] = (int *)0x6cbba3;
local_108c = (int *)(*pcVar5)();
if (local_108c != (int *)0x0) {
ppiVar13 = ppiVar14;
if (piVar8 == (int *)0x0) {
iVar11 = *local_108c;
ppiVar14[1] = local_108c;
local_1080 = &local_104c;
*ppiVar14 = (int *)&local_1064;
pcVar5 = *(code **)(iVar11 + 0x234);
ppiVar14[-1] = (int *)0x6cbf43;
(*pcVar5)();
local_1070 = local_1064;
ppiVar13 = ppiVar14 + -1;
local_106c = local_1060;
local_1068 = local_105c;
}
piVar4 = local_108c;
iVar11 = *local_108c;
ppiVar13[1] = piVar8;
*ppiVar13 = local_108c;
local_1080 = &local_104c;
ppiVar13[3] = (int *)param_4;
ppiVar13[2] = (int *)param_3;
pcVar5 = *(code **)(iVar11 + 0x568);
ppiVar13[-1] = (int *)0x6cbbe7;
(*pcVar5)();
ppiVar13[1] = (int *)param_3;
*ppiVar13 = (int *)param_2;
ppiVar13[2] = (int *)param_4;
local_1080 = &local_104c;
ppiVar13[-1] = (int *)0x6cbc06;
UTIL_SetClientVisibilityPVS((edict_t *)*ppiVar13,(uchar *)ppiVar13[1],(int)ppiVar13[2]);
local_1080 = &local_104c;
*ppiVar13 = piVar4;
ppiVar13[-1] = (int *)0x6cbc1a;
lVar15 = (longdouble)
CBasePlayer::GetFOVDistanceAdjustFactorForNetworking((CBasePlayer *)*ppiVar13);
local_1084 = (float)lVar15;
ppiVar13[2] = (int *)&local_1070;
ppiVar13[1] = local_1040;
local_1080 = &local_104c;
*ppiVar13 = local_1080;
ppiVar13[-1] = (int *)0x6cbc48;
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)*ppiVar13,(int)ppiVar13[1],
(Vector *)ppiVar13[2]);
pcVar5 = *(code **)(*engine + 0x1d4);
iVar11 = piVar4[0xc];
if (iVar11 == 0) {
iVar11 = 0;
}
else {
iVar11 = iVar11 - *(int *)(gpGlobals + 0x58) >> 4;
}
ppiVar13[2] = (int *)0x1;
ppiVar13[1] = (int *)iVar11;
*ppiVar13 = engine;
ppiVar13[-1] = (int *)0x6cbc7d;
iVar11 = (*pcVar5)();
ppiVar14 = ppiVar13;
if ((iVar11 != 0) && (piVar8 = *(int **)(iVar11 + 0xc), piVar8 != (int *)0x0)) {
iVar11 = *piVar8;
*ppiVar13 = piVar8;
pcVar5 = *(code **)(iVar11 + 0x18);
ppiVar13[-1] = (int *)0x6cbc90;
piVar8 = (int *)(*pcVar5)();
if (piVar8 != (int *)0x0) {
iVar11 = *piVar8;
*ppiVar13 = piVar8;
pcVar5 = *(code **)(iVar11 + 0x16c);
ppiVar13[-1] = (int *)0x6cbca1;
cVar7 = (*pcVar5)();
if (cVar7 != '\0') {
iVar11 = *piVar8;
ppiVar13[1] = piVar8;
*ppiVar13 = (int *)&local_1058;
pcVar5 = *(code **)(iVar11 + 0x234);
ppiVar13[-1] = (int *)0x6cbe6a;
(*pcVar5)();
ppiVar14 = ppiVar13 + -1;
ppiVar13[1] = (int *)&local_1070;
local_1070 = local_1058;
*ppiVar13 = local_1040;
local_106c = local_1054;
local_1068 = local_1050;
ppiVar13[-1] = local_1080;
ppiVar13[-2] = (int *)0x6cbeb9;
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)ppiVar13[-1],(int)*ppiVar13,
(Vector *)ppiVar13[1]);
}
}
}
goto LAB_006cbca9;
}
}
local_1080 = &local_104c;
*ppiVar14 = (int *)"ClientSetupVisibility: No entity for edict!\n";
ppiVar14[-1] = (int *)0x6cbf93;
Warning();
ppiVar14[2] = (int *)&local_1070;
ppiVar14[1] = local_1040;
local_1080 = &local_104c;
*ppiVar14 = local_1080;
ppiVar14[-1] = (int *)0x6cbfbb;
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
((CUtlVector<Vector,CUtlMemory<Vector,int>> *)*ppiVar14,(int)ppiVar14[1],
(Vector *)ppiVar14[2]);
local_108c = (int *)0x0;
local_1084 = 1.0;
LAB_006cbca9:
uVar9 = 0;
do {
pbVar1 = local_38 + uVar9;
pbVar1[0] = 0;
pbVar1[1] = 0;
pbVar1[2] = 0;
pbVar1[3] = 0;
uVar9 = uVar9 + 4;
} while (uVar9 < 0x18);
uVar9 = (uint)DAT_00fe0198;
if (DAT_00fe0198 == 0xffff) {
uVar12 = 0;
}
else {
local_1088 = &local_1058;
uVar12 = 0;
LAB_006cbd2c:
do {
piVar8 = *(int **)(g_AreaPortals + uVar9 * 8);
local_1058 = CONCAT31(local_1058._1_3_,1);
local_1038[uVar12] = piVar8[0x110];
iVar11 = *piVar8;
ppiVar14[3] = (int *)local_1088;
ppiVar14[2] = (int *)local_1084;
*ppiVar14 = piVar8;
ppiVar14[1] = local_1080;
pcVar5 = *(code **)(iVar11 + 0x324);
ppiVar14[-1] = (int *)0x6cbd77;
uVar10 = (*pcVar5)();
local_838[uVar12] = uVar10 & 0xff;
uVar12 = uVar12 + 1;
if (0x1ff < uVar12) {
iVar11 = *engine;
ppiVar14[3] = (int *)uVar12;
ppiVar14[2] = (int *)local_838;
ppiVar14[1] = local_1038;
*ppiVar14 = engine;
pcVar5 = *(code **)(iVar11 + 0x16c);
ppiVar14[-1] = (int *)0x6cbef0;
(*pcVar5)();
uVar12 = 0;
}
if (piVar8[0x111] == 0) {
local_1058 = CONCAT31(local_1058._1_3_,1);
}
else if ((char)local_1058 == '\0') {
uVar2 = *(ushort *)(g_AreaPortals + 6 + uVar9 * 8);
uVar9 = (uint)uVar2;
if (uVar2 == 0xffff) break;
goto LAB_006cbd2c;
}
uVar10 = piVar8[0x110];
if (-1 < (int)uVar10) {
if (uVar10 < 0xc0) {
local_38[(int)uVar10 >> 3] = local_38[(int)uVar10 >> 3] | (byte)(1 << ((byte)uVar10 & 7));
}
else {
ppiVar14[1] = (int *)uVar10;
*ppiVar14 = (int *)"ClientSetupVisibility: portal number (%d) too large";
ppiVar14[-1] = (int *)0x6cbf10;
Error();
}
}
uVar2 = *(ushort *)(g_AreaPortals + 6 + uVar9 * 8);
uVar9 = (uint)uVar2;
} while (uVar2 != 0xffff);
}
iVar11 = *engine;
ppiVar14[2] = (int *)local_838;
ppiVar14[3] = (int *)uVar12;
ppiVar14[1] = local_1038;
*ppiVar14 = engine;
pcVar5 = *(code **)(iVar11 + 0x16c);
ppiVar14[-1] = (int *)0x6cbde7;
(*pcVar5)();
if (local_108c != (int *)0x0) {
ppiVar14[2] = (int *)local_38;
ppiVar14[1] = local_108c;
*ppiVar14 = local_108c + 0x690;
ppiVar14[-1] = (int *)0x6cbe0f;
CPlayerLocalData::UpdateAreaBits
((CPlayerLocalData *)*ppiVar14,(CBasePlayer *)ppiVar14[1],(uchar *)ppiVar14[2]);
}
puVar6 = local_1080;
local_1040 = (int *)0x0;
*ppiVar14 = local_1080;
ppiVar14[-1] = (int *)0x6cbe27;
CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)*ppiVar14);
*ppiVar14 = puVar6;
local_103c = local_104c;
ppiVar14[-1] = (int *)0x6cbe3b;
CUtlMemory<Vector,int>::Purge((CUtlMemory<Vector,int> *)*ppiVar14);
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
ppiVar14[-1] = (int *)&UNK_006cc01c;
__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.