CEnvEffectsScript::HandleAnimEvent
0x0068f430 · 1789 bytes · __thiscall
_ZN17CEnvEffectsScript15HandleAnimEventEP11animevent_t
Decompiled
undefined (2 params)
/* CEnvEffectsScript::HandleAnimEvent(animevent_t*) */
void __thiscall CEnvEffectsScript::HandleAnimEvent(CEnvEffectsScript *this,animevent_t *param_1)
{
float fVar1;
uint uVar2;
CBaseEdict *pCVar3;
int iVar4;
uint uVar5;
CEffectScriptElement *pCVar6;
int iVar7;
int iVar8;
CBaseEntity *pCVar9;
undefined *puVar10;
undefined *puVar11;
CSprite *pCVar12;
undefined1 local_34 [12];
Vector local_28 [24];
if (*(int *)param_1 == 0x12) {
pCVar6 = (CEffectScriptElement *)GetScriptElementByName(this,*(char **)(param_1 + 4));
if (pCVar6 != (CEffectScriptElement *)0x0) {
if (*(int *)(pCVar6 + 0x88) == 1) {
TrailEffectEvent(this,pCVar6);
}
else if (*(int *)(pCVar6 + 0x88) == 2) {
SpriteEffectEvent(this,pCVar6);
}
}
}
else if (*(int *)param_1 == 0x13) {
iVar4 = GetScriptElementByName(this,*(char **)(param_1 + 4));
if ((iVar4 != 0) && (*(char *)(iVar4 + 0x1ad) != '\0')) {
*(undefined1 *)(iVar4 + 0x1ad) = 0;
if (*(int *)(iVar4 + 0x88) == 1) {
if (*(char *)(iVar4 + 0x1ac) != '\0') {
uVar5 = *(uint *)(iVar4 + 0x80);
iVar8 = 0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar10 + 4);
}
CBaseAnimating::GetAttachment
((CBaseAnimating *)this,*(int *)(iVar8 + 0x444),local_28,(Vector *)0x0,
(Vector *)0x0,(Vector *)0x0);
uVar5 = *(uint *)(iVar4 + 0x80);
pCVar9 = (CBaseEntity *)0x0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar10 + 4);
}
iVar8 = 0;
CBaseEntity::StopFollowingEntity(pCVar9);
puVar10 = g_pEntityList;
uVar5 = *(uint *)(iVar4 + 0x80);
if (((uVar5 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar11 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar11 + 4);
}
uVar2 = *(uint *)(iVar8 + 0x440);
if ((((uVar2 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc
)) && (*(uint *)(puVar11 + 8) == uVar2 >> 0xc)) && (*(int *)(puVar11 + 4) != 0)) {
if (*(char *)(iVar8 + 0x6c) == '\0') {
pCVar3 = *(CBaseEdict **)(iVar8 + 0x30);
if (pCVar3 != (CBaseEdict *)0x0) {
*(uint *)pCVar3 = *(uint *)pCVar3 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar3);
*(undefined2 *)(iVar7 + 2) = 0;
puVar10 = g_pEntityList;
}
}
else {
*(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
}
*(undefined4 *)(iVar8 + 0x440) = 0xffffffff;
uVar5 = *(uint *)(iVar4 + 0x80);
}
iVar8 = 0;
if (((uVar5 != 0xffffffff) &&
(puVar11 = puVar10 + (uVar5 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar11 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar11 + 4);
}
if (*(int *)(iVar8 + 0x444) != 0) {
if (*(char *)(iVar8 + 0x6c) == '\0') {
pCVar3 = *(CBaseEdict **)(iVar8 + 0x30);
if (pCVar3 != (CBaseEdict *)0x0) {
*(uint *)pCVar3 = *(uint *)pCVar3 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar3);
*(undefined2 *)(iVar7 + 2) = 0;
puVar10 = g_pEntityList;
}
}
else {
*(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
}
*(undefined4 *)(iVar8 + 0x444) = 0;
uVar5 = *(uint *)(iVar4 + 0x80);
}
pCVar9 = (CBaseEntity *)0x0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = puVar10 + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar10 + 4);
}
CBaseEntity::SetAbsOrigin(pCVar9,local_28);
}
uVar5 = *(uint *)(iVar4 + 0x80);
fVar1 = *(float *)(iVar4 + 0x1a4);
if (((uVar5 == 0xffffffff) ||
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 == (undefined *)0xfffffffc))
|| (*(uint *)(puVar10 + 8) != uVar5 >> 0xc)) {
pCVar12 = (CSprite *)0x0;
}
else {
pCVar12 = *(CSprite **)(puVar10 + 4);
}
CSprite::SetBrightness(pCVar12,0,fVar1);
CBaseEntity::ThinkSet
((_func_void *)local_34,(float)pCVar12,(char *)CSprite::AnimateUntilDead);
iVar8 = gpGlobals;
*(float *)(pCVar12 + 0x450) = fVar1 + *(float *)(gpGlobals + 0xc);
CBaseEntity::SetNextThink((CBaseEntity *)pCVar12,*(float *)(iVar8 + 0xc),(char *)0x0);
*(undefined4 *)(iVar4 + 0x80) = 0xffffffff;
}
else if (*(int *)(iVar4 + 0x88) == 2) {
if (*(char *)(iVar4 + 0x1ac) != '\0') {
uVar5 = *(uint *)(iVar4 + 0x84);
iVar8 = 0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar10 + 4);
}
CBaseAnimating::GetAttachment
((CBaseAnimating *)this,*(int *)(iVar8 + 0x444),local_28,(Vector *)0x0,
(Vector *)0x0,(Vector *)0x0);
uVar5 = *(uint *)(iVar4 + 0x84);
pCVar9 = (CBaseEntity *)0x0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar10 + 4);
}
iVar8 = 0;
CBaseEntity::StopFollowingEntity(pCVar9);
puVar10 = g_pEntityList;
uVar5 = *(uint *)(iVar4 + 0x84);
if (((uVar5 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar11 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar11 + 4);
}
uVar2 = *(uint *)(iVar8 + 0x440);
if (((uVar2 != 0xffffffff) &&
(puVar11 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)
) && ((*(uint *)(puVar11 + 8) == uVar2 >> 0xc && (*(int *)(puVar11 + 4) != 0)))) {
if (*(char *)(iVar8 + 0x6c) == '\0') {
pCVar3 = *(CBaseEdict **)(iVar8 + 0x30);
if (pCVar3 != (CBaseEdict *)0x0) {
*(uint *)pCVar3 = *(uint *)pCVar3 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar3);
*(undefined2 *)(iVar7 + 2) = 0;
puVar10 = g_pEntityList;
}
}
else {
*(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
}
*(undefined4 *)(iVar8 + 0x440) = 0xffffffff;
uVar5 = *(uint *)(iVar4 + 0x84);
}
iVar8 = 0;
if (((uVar5 != 0xffffffff) &&
(puVar11 = puVar10 + (uVar5 & 0xfff) * 0x10, puVar11 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar11 + 8) == uVar5 >> 0xc)) {
iVar8 = *(int *)(puVar11 + 4);
}
if (*(int *)(iVar8 + 0x444) != 0) {
if (*(char *)(iVar8 + 0x6c) == '\0') {
pCVar3 = *(CBaseEdict **)(iVar8 + 0x30);
if (pCVar3 != (CBaseEdict *)0x0) {
*(uint *)pCVar3 = *(uint *)pCVar3 | 0x101;
iVar7 = CBaseEdict::GetChangeAccessor(pCVar3);
*(undefined2 *)(iVar7 + 2) = 0;
puVar10 = g_pEntityList;
}
}
else {
*(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
}
*(undefined4 *)(iVar8 + 0x444) = 0;
uVar5 = *(uint *)(iVar4 + 0x84);
}
pCVar9 = (CBaseEntity *)0x0;
if (((uVar5 != 0xffffffff) &&
(puVar10 = puVar10 + (uVar5 & 0xfff) * 0x10, puVar10 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar10 + 8) == uVar5 >> 0xc)) {
pCVar9 = *(CBaseEntity **)(puVar10 + 4);
}
CBaseEntity::SetAbsOrigin(pCVar9,local_28);
}
uVar5 = *(uint *)(iVar4 + 0x84);
fVar1 = *(float *)(iVar4 + 0x1a4);
if (((uVar5 == 0xffffffff) ||
(puVar10 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar10 == (undefined *)0xfffffffc))
|| (*(uint *)(puVar10 + 8) != uVar5 >> 0xc)) {
pCVar12 = (CSprite *)0x0;
}
else {
pCVar12 = *(CSprite **)(puVar10 + 4);
}
CSprite::SetBrightness(pCVar12,0,fVar1);
CBaseEntity::ThinkSet
((_func_void *)local_34,(float)pCVar12,(char *)CSprite::AnimateUntilDead);
iVar8 = gpGlobals;
*(float *)(pCVar12 + 0x450) = fVar1 + *(float *)(gpGlobals + 0xc);
CBaseEntity::SetNextThink((CBaseEntity *)pCVar12,*(float *)(iVar8 + 0xc),(char *)0x0);
*(undefined4 *)(iVar4 + 0x84) = 0xffffffff;
}
}
}
else {
CBaseAnimating::HandleAnimEvent((CBaseAnimating *)this,param_1);
}
return;
}
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.