L L4D2node

GetScriptDesc<CBaseCombatCharacter>

0x005f70e0 · 482 bytes · __cdecl

_Z13GetScriptDescI20CBaseCombatCharacterEP17ScriptClassDesc_tPT_

Decompiled

ScriptClassDesc_t * (1 param)

/* ScriptClassDesc_t* GetScriptDesc<CBaseCombatCharacter>(CBaseCombatCharacter*) */

ScriptClassDesc_t * GetScriptDesc<CBaseCombatCharacter>(CBaseCombatCharacter *param_1)

{
  int iVar1;
  ScriptClassDesc_t *pSVar2;
  undefined4 uVar3;
  int iVar4;
  undefined4 *puVar5;
  int iVar6;
  
  if (GetScriptDesc<CBaseCombatCharacter>(CBaseCombatCharacter*)::bInitialized != '\0') {
    return (ScriptClassDesc_t *)g_CBaseCombatCharacter_ScriptDesc;
  }
  GetScriptDesc<CBaseCombatCharacter>(CBaseCombatCharacter*)::bInitialized = 1;
  g_CBaseCombatCharacter_ScriptDesc._8_4_ = s_Base_combat_characters__00c5b090;
  g_CBaseCombatCharacter_ScriptDesc._0_4_ = s_CBaseCombatCharacter_00c5afd6;
  g_CBaseCombatCharacter_ScriptDesc._4_4_ = s_CBaseCombatCharacter_00c5afd6;
  g_CBaseCombatCharacter_ScriptDesc._12_4_ = GetScriptDesc<CBaseFlex>((CBaseFlex *)0x0);
  uVar3 = g_CBaseCombatCharacter_ScriptDesc._28_4_;
  for (pSVar2 = (ScriptClassDesc_t *)g_CBaseCombatCharacter_ScriptDesc._12_4_;
      (iVar4 = g_CBaseCombatCharacter_ScriptDesc._44_4_, pSVar2 != (ScriptClassDesc_t *)0x0 &&
      (iVar4 = *(int *)(pSVar2 + 0x2c), *(int *)(pSVar2 + 0x2c) == 0));
      pSVar2 = *(ScriptClassDesc_t **)(pSVar2 + 0xc)) {
  }
  g_CBaseCombatCharacter_ScriptDesc._44_4_ = iVar4;
  iVar4 = g_CBaseCombatCharacter_ScriptDesc._28_4_ + 1;
  if ((iVar4 <= (int)g_CBaseCombatCharacter_ScriptDesc._20_4_) ||
     ((int)g_CBaseCombatCharacter_ScriptDesc._24_4_ < 0)) goto LAB_005f7168;
  if (g_CBaseCombatCharacter_ScriptDesc._24_4_ == 0) {
    if (g_CBaseCombatCharacter_ScriptDesc._20_4_ == 0) {
      if (iVar4 < 2) {
        g_CBaseCombatCharacter_ScriptDesc._20_4_ = 1;
        goto LAB_005f7267;
      }
      g_CBaseCombatCharacter_ScriptDesc._20_4_ = 1;
    }
    do {
      g_CBaseCombatCharacter_ScriptDesc._20_4_ = g_CBaseCombatCharacter_ScriptDesc._20_4_ * 2;
    } while ((int)g_CBaseCombatCharacter_ScriptDesc._20_4_ < iVar4);
  }
  else {
    for (g_CBaseCombatCharacter_ScriptDesc._20_4_ =
              g_CBaseCombatCharacter_ScriptDesc._24_4_ *
              ((int)g_CBaseCombatCharacter_ScriptDesc._28_4_ /
               (int)g_CBaseCombatCharacter_ScriptDesc._24_4_ + 1);
        (int)g_CBaseCombatCharacter_ScriptDesc._20_4_ < iVar4;
        g_CBaseCombatCharacter_ScriptDesc._20_4_ =
             (g_CBaseCombatCharacter_ScriptDesc._20_4_ + iVar4) / 2) {
    }
  }
LAB_005f7267:
  if (g_CBaseCombatCharacter_ScriptDesc._16_4_ == 0) {
    g_CBaseCombatCharacter_ScriptDesc._16_4_ =
         malloc(g_CBaseCombatCharacter_ScriptDesc._20_4_ * 0x30);
  }
  else {
    g_CBaseCombatCharacter_ScriptDesc._16_4_ =
         realloc((void *)g_CBaseCombatCharacter_ScriptDesc._16_4_,
                 g_CBaseCombatCharacter_ScriptDesc._20_4_ * 0x30);
    iVar4 = g_CBaseCombatCharacter_ScriptDesc._28_4_ + 1;
  }
LAB_005f7168:
  iVar1 = (iVar4 - uVar3) + -1;
  iVar6 = uVar3 * 0x30;
  g_CBaseCombatCharacter_ScriptDesc._28_4_ = iVar4;
  g_CBaseCombatCharacter_ScriptDesc._32_4_ = g_CBaseCombatCharacter_ScriptDesc._16_4_;
  if (0 < iVar1) {
    _V_memmove((void *)(g_CBaseCombatCharacter_ScriptDesc._16_4_ + 0x30 + iVar6),
               (void *)(g_CBaseCombatCharacter_ScriptDesc._16_4_ + iVar6),iVar1 * 0x30);
  }
  puVar5 = (undefined4 *)0x0;
  iVar4 = g_CBaseCombatCharacter_ScriptDesc._16_4_ + iVar6;
  if (iVar4 != 0) {
    *(undefined4 *)(iVar4 + 0x10) = 0;
    *(undefined4 *)(iVar4 + 4) = 0;
    *(undefined4 *)(iVar4 + 0xc) = 0x1e;
    *(undefined4 *)(iVar4 + 8) = 0;
    puVar5 = (undefined4 *)(iVar6 + g_CBaseCombatCharacter_ScriptDesc._16_4_);
    *(undefined4 *)(iVar4 + 0x14) = 0;
    *(undefined4 *)(iVar4 + 0x18) = 0;
    *(undefined4 *)(iVar4 + 0x1c) = 0;
    *(undefined4 *)(iVar4 + 0x20) = 0;
  }
  puVar5[2] = "Return the last nav area occupied - NULL if unknown";
  *puVar5 = "GetLastKnownArea";
  puVar5[1] = "ScriptGetLastKnownArea";
  puVar5[3] = 0x20;
  puVar5[9] = CMemberScriptBinding0<CBaseCombatCharacter*,HSCRIPT__*(CBaseCombatCharacter::*)(),HSCRIPT__*>
              ::Call;
  puVar5[10] = CBaseCombatCharacter::ScriptGetLastKnownArea;
  puVar5[0xb] = 1;
  return (ScriptClassDesc_t *)g_CBaseCombatCharacter_ScriptDesc;
}

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)