L L4D2node

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 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)