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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.