CNavMesh::CommandNavSaveSelected
0x007368c0 · 3915 bytes · __thiscall
_ZN8CNavMesh22CommandNavSaveSelectedERK8CCommand
Decompiled
undefined (2 params)
/* CNavMesh::CommandNavSaveSelected(CCommand const&) */
void __thiscall CNavMesh::CommandNavSaveSelected(CNavMesh *this,CCommand *param_1)
{
int *piVar1;
float fVar2;
float fVar3;
CNavArea *pCVar4;
CNavMesh *pCVar5;
char cVar6;
KeyValues *this_00;
KeyValues *pKVar7;
KeyValues *pKVar8;
char *pcVar9;
IBaseFileSystem *pIVar10;
int *piVar11;
int iVar12;
int iVar13;
int iVar14;
int in_GS_OFFSET;
uint in_stack_fffffe68;
int local_178;
CFmtStrN<32> *local_174;
int local_168;
CFmtStrN<32> *local_164;
CFmtStrN<32> local_150 [5];
char local_14b [39];
CFmtStrN<32> local_124 [5];
char local_11f [255];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
this_00 = KeyValues::operator_new((KeyValues *)0x2c,in_stack_fffffe68);
/* try { // try from 0073690f to 00736913 has its CatchHandler @ 00737845 */
KeyValues::KeyValues(this_00,"Selected Nav Areas",(IKeyValuesSystem *)0x0,false);
KeyValues::SetInt(this_00,"version",1);
pCVar5 = TheNavMesh;
cVar6 = IsSelectedSetEmpty(TheNavMesh);
if (cVar6 == '\0') {
if (0 < *(int *)(pCVar5 + 0x4e0)) {
local_178 = 0;
local_168 = 0;
do {
piVar1 = *(int **)(*(int *)(pCVar5 + 0x4d4) + local_168 * 4);
CFmtStrN<32>::CFmtStrN(local_150,"%d",piVar1[0x23]);
pKVar7 = (KeyValues *)KeyValues::FindKey(this_00,local_14b,true);
if (pKVar7 != (KeyValues *)0x0) {
local_178 = local_178 + 1;
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"NorthWest",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[2];
fVar3 = (float)piVar1[3];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[1]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"NorthEast",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[2];
fVar3 = (float)piVar1[9];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[4]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"SouthWest",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[5];
fVar3 = (float)piVar1[10];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[1]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"SouthEast",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[5];
fVar3 = (float)piVar1[6];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[4]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"North",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x16];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00736c10:
do {
if (iVar14 == 0) {
iVar12 = 0;
LAB_007373b0:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x16];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_124,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x16];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00736c10;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_007373b0;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"South",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x18];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00736c78:
do {
if (iVar14 == 0) {
iVar12 = 0;
LAB_007373f0:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x18];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_124,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x18];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00736c78;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_007373f0;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"East",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x17];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00736ce0:
do {
if (iVar14 == 0) {
iVar12 = 0;
LAB_00737430:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x17];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_124,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x17];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00736ce0;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_00737430;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"West",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x19];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00736d48:
do {
if (iVar14 == 0) {
iVar12 = 0;
LAB_00737370:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x19];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_124,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x19];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00736d48;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_00737370;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
(**(code **)(*piVar1 + 0x3c))(piVar1,pKVar7);
}
local_168 = local_168 + 1;
} while (local_168 < *(int *)(pCVar5 + 0x4e0));
if (local_178 != 0) {
if (*(int *)param_1 != 2) goto LAB_0073723f;
LAB_00736dcc:
local_174 = local_150;
V_FileBase(*(char **)(param_1 + 0x408),(char *)local_174,0x20);
LAB_0073726b:
local_174 = local_150;
iVar13 = 0;
do {
V_snprintf((char *)local_124,0x104,"maps/%s_selected_%4.4d.txt",local_174,iVar13);
cVar6 = (**(code **)(*(int *)(filesystem + 4) + 0x28))(filesystem + 4,local_124,0);
if (cVar6 == '\0') {
pIVar10 = (IBaseFileSystem *)0x0;
if (filesystem != 0) {
pIVar10 = (IBaseFileSystem *)(filesystem + 4);
}
cVar6 = KeyValues::SaveToFile(this_00,pIVar10,(char *)local_124,(char *)0x0);
if (cVar6 == '\0') {
Msg("Unable to save the selected set to disk.\n");
}
Msg("Selected set saved to %s. Use \'nav_merge_mesh %s_selected_%4.4d\' to merge it into another mesh.\n"
,local_124,local_174,iVar13);
KeyValues::deleteThis();
goto LAB_00737332;
}
iVar13 = iVar13 + 1;
} while (iVar13 != 1000);
Msg("Unable to find a filename to save the selected set to disk.\n");
KeyValues::deleteThis();
goto LAB_00737332;
}
}
}
else {
piVar1 = *(int **)(pCVar5 + 0x474);
if (piVar1 != (int *)0x0) {
CFmtStrN<32>::CFmtStrN(local_150,"%d",piVar1[0x23]);
pKVar7 = (KeyValues *)KeyValues::FindKey(this_00,local_14b,true);
if (pKVar7 != (KeyValues *)0x0) {
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"NorthWest",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[2];
fVar3 = (float)piVar1[3];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[1]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"NorthEast",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[2];
fVar3 = (float)piVar1[9];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[4]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"SouthWest",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[5];
fVar3 = (float)piVar1[10];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[1]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"SouthEast",true);
if (pKVar8 != (KeyValues *)0x0) {
fVar2 = (float)piVar1[5];
fVar3 = (float)piVar1[6];
KeyValues::SetFloat(pKVar8,"x",(float)piVar1[4]);
KeyValues::SetFloat(pKVar8,"y",fVar2);
KeyValues::SetFloat(pKVar8,"z",fVar3);
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"North",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x16];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_0073709e:
do {
local_164 = local_124;
if (iVar14 == 0) {
iVar12 = 0;
LAB_007375cb:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x16];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_164,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x16];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_0073709e;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_007375cb;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"South",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x18];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00737107:
do {
local_164 = local_124;
if (iVar14 == 0) {
iVar12 = 0;
LAB_00737643:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x18];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_164,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x18];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00737107;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_00737643;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"East",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x17];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_00737177:
do {
local_164 = local_124;
if (iVar14 == 0) {
iVar12 = 0;
LAB_0073767f:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x17];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_164,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x17];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_00737177;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_0073767f;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
pKVar8 = (KeyValues *)KeyValues::FindKey(pKVar7,"West",true);
if (pKVar8 != (KeyValues *)0x0) {
piVar11 = (int *)piVar1[0x19];
iVar13 = *piVar11;
if (0 < iVar13) {
iVar14 = 0;
LAB_007371e7:
do {
local_164 = local_124;
if (iVar14 == 0) {
iVar12 = 0;
LAB_00737607:
pCVar4 = (CNavArea *)piVar11[iVar12 * 2 + 1];
if (pCVar4 != (CNavArea *)0x0) {
cVar6 = IsInSelectedSet(TheNavMesh,pCVar4);
if (cVar6 == '\0') {
piVar11 = (int *)piVar1[0x19];
iVar14 = iVar14 + 1;
iVar13 = *piVar11;
if (iVar13 <= iVar14) break;
}
else {
iVar12 = iVar14 + 1;
CFmtStrN<32>::CFmtStrN(local_164,"%d",iVar14);
KeyValues::SetInt(pKVar8,local_11f,*(int *)(pCVar4 + 0x8c));
piVar11 = (int *)piVar1[0x19];
iVar13 = *piVar11;
iVar14 = iVar12;
if (iVar13 <= iVar12) break;
}
goto LAB_007371e7;
}
}
else if (1 < iVar13) {
iVar12 = 1;
do {
if (iVar12 == iVar14) goto LAB_00737607;
iVar12 = iVar12 + 1;
} while (iVar12 != iVar13);
}
iVar13 = *piVar11;
iVar14 = iVar14 + 1;
} while (iVar14 < iVar13);
}
}
(**(code **)(*piVar1 + 0x3c))(piVar1,pKVar7);
if (*(int *)param_1 == 2) goto LAB_00736dcc;
LAB_0073723f:
local_174 = local_150;
pcVar9 = "";
if (*(char **)(gpGlobals + 0x3c) != (char *)0x0) {
pcVar9 = *(char **)(gpGlobals + 0x3c);
}
V_strncpy((char *)local_174,pcVar9,0x20);
goto LAB_0073726b;
}
}
}
Msg("Not saving empty selected set to disk.\n");
KeyValues::deleteThis();
LAB_00737332:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail(this_00);
}
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.