CSceneEntity::GenerateSceneForSound
0x00811b30 · 569 bytes · __thiscall
_ZN12CSceneEntity21GenerateSceneForSoundEP9CBaseFlexPKc
Decompiled
undefined (3 params)
/* CSceneEntity::GenerateSceneForSound(CBaseFlex*, char const*) */
void * __thiscall
CSceneEntity::GenerateSceneForSound(CSceneEntity *this,CBaseFlex *param_1,char *param_2)
{
void *pvVar1;
uint uVar2;
uint uVar3;
undefined1 *puVar4;
uint **ppuVar5;
longdouble lVar6;
undefined4 local_40;
uint *local_3c;
CBaseFlex *local_38;
float local_28;
float local_24;
undefined1 *local_20 [4];
ppuVar5 = &local_3c;
if (param_1 == (CBaseFlex *)0x0) {
puVar4 = (undefined1 *)0x0;
}
else {
local_3c = (uint *)local_20;
local_38 = param_1;
local_40 = 0x811b53;
(**(code **)(*(int *)param_1 + 0x20))();
puVar4 = &DAT_00d539c2;
ppuVar5 = (uint **)&local_40;
if (local_20[0] != (undefined1 *)0x0) {
puVar4 = local_20[0];
ppuVar5 = (uint **)&local_40;
}
}
ppuVar5[1] = (uint *)puVar4;
*ppuVar5 = (uint *)param_2;
/* try { // try from 00811b6d to 00811b71 has its CatchHandler @ 00811d8a */
ppuVar5[-1] = (uint *)0x811b72;
lVar6 = (longdouble)CBaseEntity::GetSoundDuration((char *)*ppuVar5,(char *)ppuVar5[1]);
local_28 = (float)lVar6;
local_24 = local_28;
if (local_28 <= 0.0) {
*ppuVar5 = (uint *)"CSceneEntity::GenerateSceneForSound: Couldn\'t determine duration of %s\n";
ppuVar5[1] = (uint *)param_2;
ppuVar5[-1] = (uint *)0x811d83;
Warning();
pvVar1 = (void *)0x0;
}
else {
*ppuVar5 = (uint *)0x218;
ppuVar5[-1] = (uint *)0x811b97;
pvVar1 = ::operator_new((uint)*ppuVar5);
*ppuVar5 = pvVar1;
ppuVar5[1] = (uint *)(this + 0x440);
/* try { // try from 00811ba8 to 00811bac has its CatchHandler @ 00811d92 */
ppuVar5[-1] = (uint *)0x811bad;
CChoreoScene::CChoreoScene((CChoreoScene *)*ppuVar5,(IChoreoEventCallback *)ppuVar5[1]);
if (pvVar1 == (void *)0x0) {
*ppuVar5 = (uint *)"CSceneEntity::GenerateSceneForSound: Failed to allocated new scene!!!\n";
ppuVar5[-1] = (uint *)0x811d5c;
Warning();
return (void *)0x0;
}
ppuVar5[1] = (uint *)Scene_Printf;
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811bc5;
CChoreoScene::SetPrintFunc((CChoreoScene *)*ppuVar5,(_func_void_char_ptr____ *)ppuVar5[1]);
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811bcd;
uVar2 = CChoreoScene::AllocActor((CChoreoScene *)*ppuVar5);
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811bd7;
local_24 = (float)CChoreoScene::AllocChannel((CChoreoScene *)*ppuVar5);
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811be2;
uVar3 = CChoreoScene::AllocEvent((CChoreoScene *)*ppuVar5);
if (((uVar2 == 0) || (local_24 == 0.0)) || (uVar3 == 0)) {
*ppuVar5 = (uint *)
"CSceneEntity::GenerateSceneForSound: Alloc of actor, channel, or event failed!!!\n"
;
ppuVar5[-1] = (uint *)0x811d1c;
Warning();
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811d24;
CChoreoScene::~CChoreoScene((CChoreoScene *)*ppuVar5);
*ppuVar5 = pvVar1;
ppuVar5[-1] = (uint *)0x811d2c;
operator_delete(*ppuVar5);
return (void *)0x0;
}
ppuVar5[1] = (uint *)"!self";
*ppuVar5 = (uint *)uVar2;
ppuVar5[-1] = (uint *)0x811c0f;
CChoreoActor::SetName((CChoreoActor *)*ppuVar5,(char *)ppuVar5[1]);
ppuVar5[1] = (uint *)0x1;
*ppuVar5 = (uint *)uVar2;
ppuVar5[-1] = (uint *)0x811c1f;
CChoreoActor::SetActive((CChoreoActor *)*ppuVar5,SUB41(ppuVar5[1],0));
puVar4 = &DAT_00d539c2;
if (*(undefined1 **)(this + 0x444) != (undefined1 *)0x0) {
puVar4 = *(undefined1 **)(this + 0x444);
}
ppuVar5[1] = (uint *)puVar4;
*ppuVar5 = (uint *)local_24;
ppuVar5[-1] = (uint *)0x811c41;
CChoreoChannel::SetName((CChoreoChannel *)*ppuVar5,(char *)ppuVar5[1]);
ppuVar5[1] = (uint *)uVar2;
*ppuVar5 = (uint *)local_24;
ppuVar5[-1] = (uint *)0x811c50;
CChoreoChannel::SetActor((CChoreoChannel *)*ppuVar5,(CChoreoActor *)ppuVar5[1]);
*ppuVar5 = (uint *)uVar2;
ppuVar5[1] = (uint *)local_24;
ppuVar5[-1] = (uint *)0x811c5f;
CChoreoActor::AddChannel((CChoreoChannel *)*ppuVar5);
ppuVar5[1] = (uint *)0x5;
*ppuVar5 = (uint *)uVar3;
ppuVar5[-1] = (uint *)0x811c6f;
CChoreoEvent::SetType();
*ppuVar5 = (uint *)uVar3;
ppuVar5[1] = (uint *)param_2;
ppuVar5[-1] = (uint *)0x811c7e;
CChoreoEvent::SetName((CChoreoEvent *)*ppuVar5,(char *)ppuVar5[1]);
*ppuVar5 = (uint *)uVar3;
ppuVar5[1] = (uint *)param_2;
ppuVar5[-1] = (uint *)0x811c8d;
CChoreoEvent::SetParameters((CChoreoEvent *)*ppuVar5,(char *)ppuVar5[1]);
ppuVar5[1] = (uint *)0x0;
*ppuVar5 = (uint *)uVar3;
ppuVar5[-1] = (uint *)0x811c9d;
CChoreoEvent::SetStartTime((CChoreoEvent *)*ppuVar5,(float)ppuVar5[1]);
ppuVar5[3] = (uint *)0x0;
ppuVar5[2] = (uint *)0x0;
ppuVar5[1] = (uint *)0x0;
*ppuVar5 = (uint *)uVar3;
ppuVar5[-1] = (uint *)0x811cbd;
CChoreoEvent::SetUsingRelativeTag
((CChoreoEvent *)*ppuVar5,SUB41(ppuVar5[1],0),(char *)ppuVar5[2],(char *)ppuVar5[3]);
*ppuVar5 = (uint *)uVar3;
ppuVar5[1] = (uint *)local_28;
ppuVar5[-1] = (uint *)0x811cd0;
CChoreoEvent::SetEndTime((CChoreoEvent *)*ppuVar5,(float)ppuVar5[1]);
*ppuVar5 = (uint *)uVar3;
ppuVar5[-1] = (uint *)0x811cd8;
CChoreoEvent::SnapTimes((CChoreoEvent *)*ppuVar5);
ppuVar5[1] = (uint *)uVar3;
*ppuVar5 = (uint *)local_24;
ppuVar5[-1] = (uint *)0x811ce7;
CChoreoChannel::AddEvent((CChoreoEvent *)*ppuVar5);
*ppuVar5 = (uint *)uVar3;
ppuVar5[1] = (uint *)local_24;
ppuVar5[-1] = (uint *)0x811cf6;
CChoreoEvent::SetChannel((CChoreoEvent *)*ppuVar5,(CChoreoChannel *)ppuVar5[1]);
ppuVar5[1] = (uint *)uVar2;
*ppuVar5 = (uint *)uVar3;
ppuVar5[-1] = (uint *)0x811d02;
CChoreoEvent::SetActor((CChoreoEvent *)*ppuVar5,(CChoreoActor *)ppuVar5[1]);
}
return pvVar1;
}
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.