L L4D2node

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 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)