L L4D2node

TerrorNavArea::OnEnter

0x00971720 · 846 bytes · __thiscall

_ZN13TerrorNavArea7OnEnterEP20CBaseCombatCharacterP8CNavArea

Decompiled

undefined (3 params)

/* TerrorNavArea::OnEnter(CBaseCombatCharacter*, CNavArea*) */

void __thiscall
TerrorNavArea::OnEnter(TerrorNavArea *this,CBaseCombatCharacter *param_1,CNavArea *param_2)

{
  char cVar1;
  int iVar2;
  int *piVar3;
  undefined4 uVar4;
  int iVar5;
  undefined1 *puVar6;
  code *UNRECOVERED_JUMPTABLE;
  CBaseCombatCharacter *pCVar7;
  int local_20 [4];
  
  if (param_1 != (CBaseCombatCharacter *)0x0) {
    cVar1 = (**(code **)(*(int *)param_1 + 0x16c))(param_1);
    pCVar7 = (CBaseCombatCharacter *)0x0;
    if (cVar1 != '\0') {
      pCVar7 = param_1;
    }
    cVar1 = (**(code **)(*(int *)param_1 + 300))(param_1);
    if ((((cVar1 != '\0') &&
         (cVar1 = (**(code **)(*(int *)param_1 + 0x558))(param_1), cVar1 == '\0')) &&
        ((param_2 == (CNavArea *)0x0 || (((byte)param_2[0x12d] & 8) == 0)))) &&
       (((byte)this[0x12d] & 8) != 0)) {
      iVar2 = TerrorNavMesh::GetCheckpoint(TheNavMesh,(Vector *)(this + 0x2c));
      if (((iVar2 == 0) || (*(char *)(iVar2 + 0x5f) != '\0')) ||
         (iVar2 = CDirector::GetMapNumber(TheDirector), iVar2 != 0)) {
        if ((OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr == '\0') &&
           (iVar2 = __cxa_guard_acquire(&OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr),
           iVar2 != 0)) {
          DAT_01014224 = 0;
          OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr = 0;
          DAT_01014220 = "prop_door_rotating_checkpoint";
          __cxa_guard_release(&OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr);
          __cxa_atexit(CGameString::~CGameString,&OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr,
                       &__dso_handle);
        }
        if (((byte)param_1[0x14d] & 8) != 0) {
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
        }
        if (((OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr == 0) ||
            (iVar2 = OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr,
            DAT_01014224 != CGameString::gm_iSerialNumber)) &&
           (iVar2 = 0, DAT_01014220 != (char *)0x0)) {
          AllocPooledString((char *)local_20);
          OnEnter(CBaseCombatCharacter*,CNavArea*)::doorStr = local_20[0];
          DAT_01014224 = CGameString::gm_iSerialNumber;
          iVar2 = local_20[0];
        }
        iVar2 = CGlobalEntityList::FindEntityByClassnameNearestFast
                          ((CGlobalEntityList *)gEntList,iVar2,param_1 + 0x2e0,0x43960000);
        if ((iVar2 != 0) &&
           (piVar3 = (int *)(**(code **)(*gameeventmanager + 0x1c))
                                      (gameeventmanager,"player_entered_checkpoint",0,0),
           piVar3 != (int *)0x0)) {
          if (pCVar7 == (CBaseCombatCharacter *)0x0) {
            if (*(int *)(param_1 + 0x30) == 0) {
              iVar5 = 0;
            }
            else {
              iVar5 = *(int *)(param_1 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
            }
            (**(code **)(*piVar3 + 0x30))(piVar3,"entityid",iVar5);
          }
          else {
            UNRECOVERED_JUMPTABLE = *(code **)(*piVar3 + 0x30);
            uVar4 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(pCVar7 + 0x30));
            (*UNRECOVERED_JUMPTABLE)(piVar3,"userid",uVar4);
          }
          if (*(int *)(iVar2 + 0x30) == 0) {
            iVar5 = 0;
          }
          else {
            iVar5 = *(int *)(iVar2 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
          }
          (**(code **)(*piVar3 + 0x30))(piVar3,"door",iVar5);
          (**(code **)(*piVar3 + 0x30))(piVar3,"area",*(undefined4 *)(this + 0x8c));
          puVar6 = &DAT_00d539c2;
          if (*(undefined1 **)(iVar2 + 0x154) != (undefined1 *)0x0) {
            puVar6 = *(undefined1 **)(iVar2 + 0x154);
          }
          (**(code **)(*piVar3 + 0x3c))(piVar3,"doorname",puVar6);
          UNRECOVERED_JUMPTABLE = *(code **)(*gameeventmanager + 0x20);
LAB_00971936:
                    /* WARNING: Could not recover jumptable at 0x0097193d. Too many branches */
                    /* WARNING: Treating indirect jump as call */
          (*UNRECOVERED_JUMPTABLE)();
          return;
        }
      }
      else if ((pCVar7 != (CBaseCombatCharacter *)0x0) &&
              (piVar3 = (int *)(**(code **)(*gameeventmanager + 0x1c))
                                         (gameeventmanager,"player_entered_start_area",0,0),
              piVar3 != (int *)0x0)) {
        UNRECOVERED_JUMPTABLE = *(code **)(*piVar3 + 0x30);
        uVar4 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(pCVar7 + 0x30));
        (*UNRECOVERED_JUMPTABLE)(piVar3,"userid",uVar4);
        UNRECOVERED_JUMPTABLE = *(code **)(*gameeventmanager + 0x20);
        goto LAB_00971936;
      }
    }
  }
  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)