L L4D2node

CSpeechScriptBridge::MakeOldResponse

0x0080b810 · 1500 bytes · __thiscall

_ZN19CSpeechScriptBridge15MakeOldResponseEP11AI_ResponsePKNS_17CSpeechResponse_tEf

Decompiled

undefined (4 params)

/* CSpeechScriptBridge::MakeOldResponse(AI_Response*, CSpeechScriptBridge::CSpeechResponse_t const*,
   float) */

char __thiscall
CSpeechScriptBridge::MakeOldResponse
          (CSpeechScriptBridge *this,AI_Response *param_1,CSpeechResponse_t *param_2,float param_3)

{
  HSCRIPT__ *pHVar1;
  HSCRIPT__ *pHVar2;
  HSCRIPT__ *pHVar3;
  bool bVar4;
  char cVar5;
  char cVar6;
  undefined2 uVar7;
  undefined4 uVar8;
  undefined1 uVar9;
  undefined4 *puVar10;
  int *piVar11;
  float fVar12;
  AI_Response *pAVar13;
  bool local_79;
  HSCRIPT__ *local_78;
  float local_74;
  HSCRIPT__ *local_70;
  HSCRIPT__ *local_6c;
  float local_68;
  undefined1 local_64 [4];
  HSCRIPT__ *local_60;
  char *local_5c;
  undefined4 local_58;
  undefined2 local_54;
  ushort local_52;
  char *local_50;
  undefined4 local_4c;
  undefined2 local_48;
  ushort local_46;
  undefined4 local_44;
  undefined2 local_40;
  undefined2 local_3e;
  short local_3c;
  ushort local_3a;
  undefined2 local_38;
  ushort local_36;
  undefined1 local_34;
  undefined2 local_33;
  undefined2 local_31;
  undefined4 local_2f;
  undefined4 local_2b;
  undefined4 local_27;
  undefined4 local_23;
  
  puVar10 = &local_44;
                    /* try { // try from 0080b829 to 0080b82d has its CatchHandler @ 0080bf26 */
  CSpeechResponse_t::CallFunc();
  pHVar3 = local_44;
  uVar9 = SUB41(puVar10,0);
  if (local_3c == 0) {
    Warning("Script failed to return response after matching rule.\n",param_2);
LAB_0080b850:
    if ((local_3a & 1) != 0) {
      free(local_44);
    }
    return '\0';
  }
  if (local_3c != 0x20) {
                    /* try { // try from 0080b84b to 0080b883 has its CatchHandler @ 0080bf0b */
    Warning("Script returned a response of inappropriate type %d\n",(int)local_3c);
    goto LAB_0080b850;
  }
  if ((local_3a & 1) != 0) {
    free(local_44);
    uVar9 = SUB41(local_44,0);
  }
  local_54 = 0;
  local_52 = 0;
  local_36 = 0;
  local_38 = 100;
  local_3c = 0;
  local_3a = 0;
  local_33 = 0;
  local_31 = 0;
  local_48 = 0;
  local_46 = 0;
  local_44 = (HSCRIPT__ *)0x0;
  local_40 = 0;
  local_3e = 0;
  *(float *)(param_1 + 0xb0) = param_3;
  local_5c = (char *)0x0;
  local_2b = 0;
  local_27 = 0;
  local_23 = 0;
  local_34 = 0;
  local_2f = 0;
  local_50 = (char *)0x0;
  local_78 = (HSCRIPT__ *)0x0;
  local_74 = 0.0;
  local_60 = (HSCRIPT__ *)0x0;
                    /* try { // try from 0080b958 to 0080b95c has its CatchHandler @ 0080bf19 */
  bVar4 = SafeGet<int>(pHVar3,"kind",(int *)&local_60,(bool)uVar9);
  pHVar1 = local_60;
  cVar5 = '\0';
  if (!bVar4) goto LAB_0080b967;
  local_60 = (HSCRIPT__ *)0x0;
                    /* try { // try from 0080ba27 to 0080ba2b has its CatchHandler @ 0080bee2 */
  cVar5 = GetValueToAutoRef((CScriptAutoRef *)&local_60,pHVar3,"func");
  pHVar2 = local_60;
  if (cVar5 != '\0') {
    if (*(int *)(param_1 + 0x84) != 0) {
                    /* try { // try from 0080baef to 0080bb17 has its CatchHandler @ 0080bee2 */
      piVar11 = g_pScriptVM;
      (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,*(int *)(param_1 + 0x84));
      uVar9 = SUB41(piVar11,0);
      *(undefined4 *)(param_1 + 0x84) = 0;
    }
    if (pHVar2 != (HSCRIPT__ *)0x0) {
      piVar11 = g_pScriptVM;
      uVar8 = (**(code **)(*g_pScriptVM + 0x40))(g_pScriptVM,pHVar2);
      uVar9 = SUB41(piVar11,0);
      *(undefined4 *)(param_1 + 0x84) = uVar8;
    }
  }
  if (local_60 != (HSCRIPT__ *)0x0) {
    piVar11 = g_pScriptVM;
    (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_60);
    uVar9 = SUB41(piVar11,0);
  }
  if ((pHVar1 == (HSCRIPT__ *)0x3) || (pHVar1 == (HSCRIPT__ *)0x6)) {
    if (pHVar1 == (HSCRIPT__ *)0x6) {
      if ((local_52 & 1) != 0) {
        free(local_5c);
        uVar9 = SUB41(local_5c,0);
        local_52 = local_52 & 0xfffe;
      }
      local_58 = 0;
      local_54 = 0x1f;
      local_5c = "(script)";
    }
    else {
                    /* try { // try from 0080ba6d to 0080ba71 has its CatchHandler @ 0080bf19 */
      bVar4 = SafeGet<CVariantBase<CVariantDefaultAllocator>>
                        (pHVar3,"target",(CVariantBase *)&local_5c,(bool)uVar9);
      if (!bVar4) goto LAB_0080bb50;
    }
    local_70 = (HSCRIPT__ *)0x0;
                    /* try { // try from 0080ba91 to 0080ba95 has its CatchHandler @ 0080bedb */
    cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_70,pHVar3,"rule");
    cVar5 = '\0';
    if (cVar6 != '\0') {
                    /* try { // try from 0080bb99 to 0080bb9d has its CatchHandler @ 0080bedb */
      bVar4 = SafeGet<CVariantBase<CVariantDefaultAllocator>>
                        (local_70,"rulename",(CVariantBase *)&local_50,(bool)uVar9);
      if (!bVar4) {
        if ((local_46 & 1) != 0) {
          free(local_50);
          uVar9 = SUB41(local_50,0);
          local_46 = local_46 & 0xfffe;
        }
        local_4c = 0;
        local_48 = 0x1f;
        local_50 = "(broken)";
      }
      local_6c = (HSCRIPT__ *)0x0;
                    /* try { // try from 0080bbe0 to 0080bbe4 has its CatchHandler @ 0080bed4 */
      cVar5 = GetValueToAutoRef((CScriptAutoRef *)&local_6c,pHVar3,"params");
      if (cVar5 != '\0') {
                    /* try { // try from 0080bc1f to 0080bd5e has its CatchHandler @ 0080bed4 */
        bVar4 = SafeGet<float>(local_6c,"predelay",&local_68,(bool)uVar9);
        if (bVar4) {
          local_36 = local_36 | 0x100;
          fVar12 = local_68;
          local_31 = float16::ConvertFloatTo16bits(local_68);
          uVar9 = SUB41(fVar12,0);
        }
        bVar4 = SafeGet<float>(local_6c,"delay",&local_68,(bool)uVar9);
        if (bVar4) {
          local_36 = local_36 | 1;
          fVar12 = local_68;
          uVar7 = float16::ConvertFloatTo16bits(local_68);
          uVar9 = SUB41(fVar12,0);
          local_44 = (HSCRIPT__ *)CONCAT22(uVar7,(undefined2)local_44);
        }
        bVar4 = SafeGet<bool>(local_6c,"speakonce",&local_79,(bool)uVar9);
        if ((bVar4) && (local_79 != false)) {
          local_36 = local_36 | 2;
        }
        bVar4 = SafeGet<bool>(local_6c,"noscene",&local_79,(bool)uVar9);
        if ((bVar4) && (local_79 != false)) {
          local_36 = local_36 | 0x20;
        }
        bVar4 = SafeGet<bool>(local_6c,"stop_on_nonidle",&local_79,(bool)uVar9);
        if (bVar4) {
          uVar9 = 0x2c;
          Warning();
        }
        bVar4 = SafeGet<int>(local_6c,"odds",(int *)local_64,(bool)uVar9);
        if (bVar4) {
          local_38 = local_64._0_2_;
        }
        else {
          local_38 = 1;
        }
        bVar4 = SafeGet<float>(local_6c,"respeakdelay",&local_68,(bool)uVar9);
        if (bVar4) {
          local_3e = float16::ConvertFloatTo16bits(local_68);
          uVar9 = SUB41(local_68,0);
        }
        bVar4 = SafeGet<int>(local_6c,"soundlevel",(int *)local_64,(bool)uVar9);
        if (bVar4) {
          local_34 = local_64[0];
        }
        pAVar13 = param_1;
        AI_Response::Init(param_1,pHVar1,local_5c,&local_44,local_50,0,0);
        uVar9 = SUB41(pAVar13,0);
        local_60 = (HSCRIPT__ *)0x0;
                    /* try { // try from 0080bd71 to 0080bd75 has its CatchHandler @ 0080be17 */
        cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_60,local_6c,"followup");
        if (cVar6 != '\0') {
                    /* try { // try from 0080bdbc to 0080be11 has its CatchHandler @ 0080be17 */
          cVar6 = GetValueToAutoRef((CScriptAutoRef *)&local_78,local_60,"func");
          if ((cVar6 == '\0') ||
             (bVar4 = SafeGet<float>(local_60,"delay",&local_74,(bool)uVar9), !bVar4)) {
            Warning("Script response in rule %s had a \'followup\' parameter, but it didn\'t have \'func\' and \'delay\' keys"
                    ,local_50);
          }
          else {
            AI_Response::SetScriptFollowup(param_1,local_78,local_60,local_74);
          }
        }
        if (local_60 != (HSCRIPT__ *)0x0) {
          (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_60);
          local_60 = (HSCRIPT__ *)0x0;
        }
      }
      if (local_6c != (HSCRIPT__ *)0x0) {
        (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_6c);
        local_6c = (HSCRIPT__ *)0x0;
      }
    }
    if (local_70 != (HSCRIPT__ *)0x0) {
      (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_70);
      local_70 = (HSCRIPT__ *)0x0;
    }
  }
  else {
                    /* try { // try from 0080bb4b to 0080bb4f has its CatchHandler @ 0080bf19 */
    Warning("Unsupported response type %d",pHVar1);
LAB_0080bb50:
    cVar5 = '\0';
  }
LAB_0080b967:
  if (local_78 != (HSCRIPT__ *)0x0) {
    (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,local_78);
    local_78 = (HSCRIPT__ *)0x0;
  }
  if ((local_46 & 1) != 0) {
    free(local_50);
    local_46 = local_46 & 0xfffe;
  }
  local_50 = (char *)0x0;
  local_4c = 0;
  local_48 = 0;
  AI_ResponseParams::ScriptFollowup_t::Release((ScriptFollowup_t *)&local_2b);
  if ((local_52 & 1) != 0) {
    free(local_5c);
    local_52 = local_52 & 0xfffe;
  }
  local_5c = (char *)0x0;
  local_58 = 0;
  local_54 = 0;
  if (pHVar3 == (HSCRIPT__ *)0x0) {
    return cVar5;
  }
  (**(code **)(*g_pScriptVM + 0x30))(g_pScriptVM,pHVar3);
  return cVar5;
}

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)