TerrorNavMesh::CommandNavFloodSelect
0x00982f90 · 1115 bytes · __thiscall
_ZN13TerrorNavMesh21CommandNavFloodSelectERK8CCommand
Decompiled
undefined (2 params)
/* TerrorNavMesh::CommandNavFloodSelect(CCommand const&) */
void __thiscall TerrorNavMesh::CommandNavFloodSelect(TerrorNavMesh *this,CCommand *param_1)
{
CNavArea *pCVar1;
float fVar2;
CBaseEntity *this_00;
int iVar3;
uint uVar4;
int iVar5;
char *pcVar6;
int iVar7;
double dVar8;
float local_6c;
uint local_60;
float local_5c;
float local_54;
uint local_4c;
undefined4 local_48;
uint local_40;
CNavArea *local_3c;
undefined4 local_38;
uint local_34;
uint local_30;
float local_2c;
float local_28;
float local_24;
undefined4 local_20;
this_00 = (CBaseEntity *)UTIL_GetListenServerHost();
if ((this_00 == (CBaseEntity *)0x0) || (1 < *(uint *)(this + 0x458))) {
return;
}
CNavMesh::FindActiveNavArea((CNavMesh *)this);
pCVar1 = *(CNavArea **)(this + 0x474);
if (pCVar1 != (CNavArea *)0x0) {
CBaseEntity::EmitSound(this_00,"EDIT_DELETE",0.0,(float *)0x0);
if (*(int *)param_1 < 2) {
local_40 = 3;
local_5c = 0.0;
local_60 = 0;
local_6c = -1.0;
local_54 = 1.0;
local_4c = 0;
local_48 = 0xffff;
}
else {
local_40 = 3;
local_54 = 1.0;
local_6c = -1.0;
local_5c = 0.0;
local_60 = 0;
local_4c = 0;
local_48 = 0xffff;
iVar7 = 1;
do {
while (-1 < iVar7) {
pcVar6 = *(char **)(param_1 + iVar7 * 4 + 0x408);
if ((pcVar6 == "out") || (iVar3 = _V_stricmp("out",pcVar6), iVar3 == 0))
goto LAB_00983063;
if ((pcVar6 == "in") || (iVar3 = _V_stricmp("in",pcVar6), iVar3 == 0)) goto LAB_009830b0;
if (pcVar6 != "fog") goto LAB_009831a8;
LAB_00983260:
iVar3 = iVar7 + 1;
local_48 = *(undefined4 *)(pCVar1 + 0x160);
iVar5 = *(int *)param_1;
LAB_0098306f:
iVar7 = iVar3;
if (iVar5 <= iVar3) goto LAB_009830c3;
}
iVar3 = _V_stricmp("out","");
if (iVar3 == 0) {
LAB_00983063:
iVar5 = *(int *)param_1;
iVar3 = iVar7 + 1;
local_40 = 2;
goto LAB_0098306f;
}
pcVar6 = "";
iVar3 = _V_stricmp("in","");
if (iVar3 != 0) {
LAB_009831a8:
iVar3 = _V_stricmp("fog",pcVar6);
if (iVar3 == 0) goto LAB_00983260;
iVar3 = TerrorNavArea::SpawnAttributeFromString(pcVar6);
if (iVar3 == 0) {
if (((pcVar6 == "minlight") || (iVar3 = _V_stricmp("minlight",pcVar6), iVar3 == 0)) &&
(iVar7 + 1 < *(int *)param_1)) {
pcVar6 = "";
if (-1 < iVar7 + 1) {
pcVar6 = *(char **)(param_1 + iVar7 * 4 + 0x40c);
}
iVar3 = iVar7 + 2;
dVar8 = strtod(pcVar6,(char **)0x0);
iVar5 = *(int *)param_1;
fVar2 = 0.0;
if (0.0 <= (float)dVar8) {
fVar2 = (float)dVar8;
}
local_5c = 1.0;
if (fVar2 <= 1.0) {
local_5c = fVar2;
}
if (local_54 <= local_5c) {
local_54 = local_5c;
}
}
else {
iVar3 = iVar7 + 1;
if (((pcVar6 == "maxlight") || (iVar5 = _V_stricmp("maxlight",pcVar6), iVar5 == 0)) &&
(iVar3 < *(int *)param_1)) {
pcVar6 = "";
if (-1 < iVar3) {
pcVar6 = *(char **)(param_1 + iVar3 * 4 + 0x408);
}
dVar8 = strtod(pcVar6,(char **)0x0);
iVar5 = *(int *)param_1;
fVar2 = 0.0;
if (0.0 <= (float)dVar8) {
fVar2 = (float)dVar8;
}
iVar3 = iVar7 + 2;
local_54 = 1.0;
if (fVar2 <= 1.0) {
local_54 = fVar2;
}
if (local_54 <= local_5c) {
local_5c = local_54;
}
}
else if ((pcVar6 == "radius") || (iVar5 = _V_stricmp("radius",pcVar6), iVar5 == 0)) {
iVar5 = *(int *)param_1;
if (iVar3 < iVar5) {
pcVar6 = "";
if (-1 < iVar3) {
pcVar6 = *(char **)(param_1 + iVar3 * 4 + 0x408);
}
dVar8 = strtod(pcVar6,(char **)0x0);
iVar5 = *(int *)param_1;
iVar3 = iVar7 + 2;
local_6c = (float)dVar8;
}
}
else {
iVar5 = *(int *)param_1;
}
}
}
else {
uVar4 = TerrorNavArea::SpawnAttributeFromString(pcVar6);
if ((*(uint *)(pCVar1 + 300) & uVar4) == 0) {
uVar4 = TerrorNavArea::SpawnAttributeFromString(pcVar6);
iVar3 = iVar7 + 1;
local_60 = local_60 | uVar4;
iVar5 = *(int *)param_1;
}
else {
uVar4 = TerrorNavArea::SpawnAttributeFromString(pcVar6);
iVar3 = iVar7 + 1;
local_4c = local_4c | uVar4;
iVar5 = *(int *)param_1;
}
}
goto LAB_0098306f;
}
LAB_009830b0:
iVar7 = iVar7 + 1;
local_40 = 7;
} while (iVar7 < *(int *)param_1);
}
LAB_009830c3:
local_20 = 0;
local_34 = local_4c;
local_2c = local_5c;
local_30 = local_60;
local_28 = local_54;
local_24 = local_6c;
local_38 = local_48;
local_3c = pCVar1;
SearchSurroundingAreas<FloodSelectCollector>
(pCVar1,(Vector *)(pCVar1 + 0x2c),(FloodSelectCollector *)&local_3c,-1.0,local_40,-1);
Msg("Selected %d areas.\n",local_20);
}
CNavMesh::SetMarkedArea((CNavMesh *)this,(CNavArea *)0x0);
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.