L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)