L L4D2node

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