Infected::SetAlertBodyGroupVariant
0x00a149b0 · 798 bytes · __thiscall
_ZN8Infected24SetAlertBodyGroupVariantEPKcS1_
Decompiled
undefined (3 params)
/* WARNING: Type propagation algorithm not settling */
/* Infected::SetAlertBodyGroupVariant(char const*, char const*) */
uint __thiscall Infected::SetAlertBodyGroupVariant(Infected *this,char *param_1,char *param_2)
{
int iVar1;
int *piVar2;
char cVar3;
int iVar4;
uint uVar5;
int iVar6;
char *pcVar7;
size_t sVar8;
size_t sVar9;
int iVar10;
undefined4 *puVar11;
int *piVar12;
int in_GS_OFFSET;
bool bVar13;
undefined1 local_45;
int local_44;
int local_40 [12];
piVar12 = (int *)&stack0xffffff84;
local_40[8] = *(int *)(in_GS_OFFSET + 0x14);
if (*(int *)(ZombieExpressions._28_4_ + 0x30) == 0) {
iVar4 = CBaseAnimating::FindBodygroupByName((CBaseAnimating *)this,param_1);
if ((-1 < iVar4) &&
(iVar6 = CBaseAnimating::GetNumBodyGroups((CBaseAnimating *)this), iVar4 < iVar6)) {
iVar6 = CBaseAnimating::GetBodygroup((CBaseAnimating *)this,iVar4);
pcVar7 = (char *)CBaseAnimating::GetBodygroupPartName((CBaseAnimating *)this,iVar4,iVar6);
if (1 < (byte)(*pcVar7 + 0xbcU)) {
local_45 = 0x58;
local_44 = -1;
iVar6 = sscanf(pcVar7,"%c%d");
if (iVar6 == 2) {
sVar8 = strlen(param_2);
local_40[3] = 0;
local_40[4] = 0;
local_40[5] = 0;
local_40[6] = 0;
local_40[7] = 0;
/* try { // try from 00a14b84 to 00a14cdd has its CatchHandler @ 00a14cea */
iVar6 = CBaseAnimating::GetBodygroupCount((CBaseAnimating *)this,iVar4);
piVar2 = local_40 + 3;
local_40[0] = 0;
puVar11 = (undefined4 *)&stack0xffffff84;
if (0 < iVar6) {
do {
puVar11[2] = local_40[0];
puVar11[1] = iVar4;
*puVar11 = this;
puVar11[-1] = 0xa14bd2;
pcVar7 = (char *)CBaseAnimating::GetBodygroupPartName
((CBaseAnimating *)*puVar11,puVar11[1],puVar11[2]);
*puVar11 = pcVar7;
local_40[1] = 0xffffffff;
local_40[2] = -1;
puVar11[-1] = 0xa14bea;
sVar9 = strlen((char *)*puVar11);
iVar1 = -((sVar9 + 0x10 & 0xfffffff0) + 0x10);
piVar12 = (int *)((int)puVar11 + iVar1);
*(char **)((int)puVar11 + iVar1 + 4) = "E%d_%c%d_%s";
*(int **)((int)puVar11 + iVar1 + 0x10) = local_40 + 2;
uVar5 = (int)puVar11 + iVar1 + 0x27 & 0xfffffff0;
*(char **)((int)puVar11 + iVar1) = pcVar7;
*(undefined1 **)((int)puVar11 + iVar1 + 0xc) = &local_45;
*(uint *)((int)puVar11 + iVar1 + 0x14) = uVar5;
*(int **)((int)puVar11 + iVar1 + 8) = local_40 + 1;
*(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c28;
iVar10 = sscanf(*(char **)((int)puVar11 + iVar1),*(char **)((int)puVar11 + iVar1 + 4))
;
if (((iVar10 == 4) && (*pcVar7 == 'E')) && (local_44 == local_40[2])) {
*(uint *)((int)puVar11 + iVar1) = uVar5;
*(size_t *)((int)puVar11 + iVar1 + 8) = sVar8;
*(char **)((int)puVar11 + iVar1 + 4) = param_2;
*(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c5b;
iVar10 = V_strnicmp(*(char **)((int)puVar11 + iVar1),
*(char **)((int)puVar11 + iVar1 + 4),
*(int *)((int)puVar11 + iVar1 + 8));
if (iVar10 == 0) {
*(int **)((int)puVar11 + iVar1 + 8) = local_40;
*(int *)((int)puVar11 + iVar1 + 4) = local_40[6];
*(int **)((int)puVar11 + iVar1) = piVar2;
*(undefined4 *)((int)puVar11 + iVar1 + -4) = 0xa14c7c;
CUtlVector<int,CUtlMemory<int,int>>::InsertBefore
(*(CUtlVector<int,CUtlMemory<int,int>> **)((int)puVar11 + iVar1),
*(int *)((int)puVar11 + iVar1 + 4),*(int **)((int)puVar11 + iVar1 + 8))
;
}
}
local_40[0] = local_40[0] + 1;
puVar11 = (undefined4 *)((int)puVar11 + iVar1);
} while (local_40[0] < iVar6);
}
bVar13 = local_40[6] != 0;
if (bVar13) {
iVar6 = local_40[6] + -1;
*piVar12 = 0;
piVar12[1] = iVar6;
piVar12[-1] = 0xa14cc8;
iVar6 = RandomInt();
iVar6 = *(int *)(local_40[3] + iVar6 * 4);
piVar12[1] = iVar4;
*piVar12 = (int)this;
piVar12[2] = iVar6;
piVar12[-1] = 0xa14cde;
CBaseAnimating::SetBodygroup((CBaseAnimating *)*piVar12,piVar12[1],piVar12[2]);
}
uVar5 = (uint)bVar13;
local_40[6] = 0;
*piVar12 = (int)piVar2;
piVar12[-1] = 0xa14c9f;
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)*piVar12);
iVar4 = local_40[3];
*piVar12 = (int)piVar2;
local_40[7] = iVar4;
piVar12[-1] = 0xa14cad;
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)*piVar12);
goto LAB_00a14a06;
}
}
}
uVar5 = 0;
piVar12 = (int *)&stack0xffffff84;
}
else {
iVar4 = CBaseAnimatingOverlay::FindGestureLayer();
cVar3 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
if (cVar3 == '\0') {
iVar4 = CBaseAnimatingOverlay::FindGestureLayer();
cVar3 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
if (cVar3 != '\0') {
CBaseAnimatingOverlay::RemoveLayer((CBaseAnimatingOverlay *)this,iVar4,0.2,0.0);
}
iVar4 = CBaseAnimatingOverlay::AddGesture();
uVar5 = CBaseAnimatingOverlay::IsValidLayer((CBaseAnimatingOverlay *)this,iVar4);
if ((char)uVar5 != '\0') {
CBaseAnimatingOverlay::SetLayerLooping((CBaseAnimatingOverlay *)this,iVar4,true);
piVar12 = (int *)&stack0xffffff84;
goto LAB_00a14a06;
}
}
uVar5 = 1;
piVar12 = (int *)&stack0xffffff84;
}
LAB_00a14a06:
if (local_40[8] != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
*(undefined1 **)((int)piVar12 + -4) = &LAB_00a14cea;
__stack_chk_fail();
}
return uVar5;
}
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.