L L4D2node

CCombatCharVisCache::LookupVisibility

0x003ffad0 · 570 bytes · __thiscall

_ZN19CCombatCharVisCache16LookupVisibilityEPK20CBaseCombatCharacterPS0_

Decompiled

undefined (3 params)

/* CCombatCharVisCache::LookupVisibility(CBaseCombatCharacter const*, CBaseCombatCharacter*) */

uint __thiscall
CCombatCharVisCache::LookupVisibility
          (CCombatCharVisCache *this,CBaseCombatCharacter *param_1,CBaseCombatCharacter *param_2)

{
  ushort uVar1;
  undefined4 *puVar2;
  int iVar3;
  uint uVar4;
  uint uVar5;
  ushort *puVar6;
  int iVar7;
  undefined4 local_2c;
  undefined4 local_28;
  
  local_2c = 0xffffffff;
  local_28 = 0xffffffff;
  if (param_1 < param_2) {
    if (param_1 != (CBaseCombatCharacter *)0x0) {
      puVar2 = (undefined4 *)(**(code **)(*(int *)param_1 + 0xc))(param_1);
      local_2c = *puVar2;
    }
    if (param_2 != (CBaseCombatCharacter *)0x0) {
      puVar2 = (undefined4 *)(**(code **)(*(int *)param_2 + 0xc))(param_2);
      local_28 = *puVar2;
      goto LAB_003ffb68;
    }
  }
  else {
    if (param_2 != (CBaseCombatCharacter *)0x0) {
      puVar2 = (undefined4 *)(**(code **)(*(int *)param_2 + 0xc))(param_2);
      local_2c = *puVar2;
    }
    if (param_1 != (CBaseCombatCharacter *)0x0) {
      puVar2 = (undefined4 *)(**(code **)(*(int *)param_1 + 0xc))(param_1);
      local_28 = *puVar2;
      goto LAB_003ffb68;
    }
  }
  local_28 = 0xffffffff;
LAB_003ffb68:
  uVar1 = *(ushort *)(this + 0x1c);
  while (uVar1 != 0xffff) {
    while( true ) {
      uVar5 = (uint)uVar1;
      iVar7 = uVar5 * 0x18;
      puVar6 = (ushort *)(*(int *)(this + 0x10) + iVar7);
      iVar3 = memcmp(&local_2c,puVar6 + 4,8);
      if (iVar3 < 0) break;
      iVar3 = memcmp(puVar6 + 4,&local_2c,8);
      if (-1 < iVar3) {
        if (uVar5 == 0xffff) goto LAB_003ffbdd;
        goto LAB_003ffc27;
      }
      if (CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
          ::Links(unsigned_short)::s_Sentinel == '\0') {
        iVar3 = __cxa_guard_acquire(&CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
                                     ::Links(unsigned_short)::s_Sentinel);
        if (iVar3 != 0) {
          CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
          ::Links(unsigned_short)::s_Sentinel = 0xffff;
          DAT_00f13992 = 0xffff;
          DAT_00f13994 = 0xffff;
          __cxa_guard_release(&CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
                               ::Links(unsigned_short)::s_Sentinel);
        }
        puVar6 = (ushort *)(iVar7 + *(int *)(this + 0x10));
      }
      uVar1 = puVar6[1];
      if (uVar1 == 0xffff) goto LAB_003ffbdd;
    }
    if (CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
        ::Links(unsigned_short)::s_Sentinel == '\0') {
      iVar3 = __cxa_guard_acquire(&CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
                                   ::Links(unsigned_short)::s_Sentinel);
      if (iVar3 != 0) {
        CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
        ::Links(unsigned_short)::s_Sentinel = 0xffff;
        DAT_00f13992 = 0xffff;
        DAT_00f13994 = 0xffff;
        __cxa_guard_release(&CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
                             ::Links(unsigned_short)::s_Sentinel);
      }
      puVar6 = (ushort *)(iVar7 + *(int *)(this + 0x10));
    }
    uVar1 = *puVar6;
  }
LAB_003ffbdd:
  if (*(short *)(this + 0x1e) == -1) {
    uVar4 = 0x80000000;
  }
  else {
    uVar5 = CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
            ::Insert((CUtlRBTree<CCombatCharVisCache::VisCacheEntry_t,unsigned_short,CCombatCharVisCache::CVisCacheEntryLess,CUtlMemory<UtlRBTreeNode_t<CCombatCharVisCache::VisCacheEntry_t,unsigned_short>,unsigned_short>>
                      *)(this + 0xc),(VisCacheEntry_t *)&local_2c);
    uVar5 = uVar5 & 0xffff;
    *(float *)(uVar5 * 0x18 + *(int *)(this + 0x10) + 0x10) = *(float *)(gpGlobals + 0xc) - 0.18;
LAB_003ffc27:
    uVar4 = ~uVar5;
    if (param_1 < param_2) {
      uVar4 = uVar5;
    }
  }
  return uVar4;
}

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)