L L4D2node

CRuleScriptBridge::AddCriterionFromScript

0x0080bf30 · 2231 bytes · __cdecl

_ZN17CRuleScriptBridge22AddCriterionFromScriptERN3rr212CRuleBuilderERK14CScriptAutoRef

Decompiled

undefined (2 params)

/* WARNING: Removing unreachable block (ram,0x0080c3a3) */
/* WARNING: Removing unreachable block (ram,0x0080c560) */
/* WARNING: Removing unreachable block (ram,0x0080c573) */
/* CRuleScriptBridge::AddCriterionFromScript(rr2::CRuleBuilder&, CScriptAutoRef const&) */

undefined4 CRuleScriptBridge::AddCriterionFromScript(CRuleBuilder *param_1,CScriptAutoRef *param_2)

{
  char *pcVar1;
  CriterionLambda CVar2;
  ushort uVar3;
  void *pvVar4;
  char cVar5;
  int iVar6;
  undefined4 *puVar7;
  char *pcVar8;
  undefined4 uVar9;
  undefined8 uVar10;
  char *local_88;
  char *local_84;
  float local_70;
  ushort local_66;
  char local_64 [2];
  char local_62 [2];
  void *local_60 [2];
  ushort local_58;
  ushort local_56;
  void *local_54 [2];
  short local_4c;
  ushort local_4a;
  char *local_48;
  int iStack_44;
  short local_40;
  ushort local_3e;
  ushort local_3c;
  ushort uStack_3a;
  int iStack_38;
  ushort local_34;
  ushort local_32;
  CriterionLambda local_30;
  undefined1 uStack_2f;
  ushort uStack_2e;
  float fStack_2c;
  undefined4 *local_28;
  char *local_24;
  char *local_20;
  
  local_28 = (undefined4 *)0x0;
  local_30 = (CriterionLambda)0x0;
  uStack_2f = 0;
  uStack_2e = 0;
                    /* try { // try from 0080bf71 to 0080bf76 has its CatchHandler @ 0080c8b8 */
  cVar5 = (**(code **)(*g_pScriptVM + 0x90))
                    (g_pScriptVM,*(undefined4 *)param_2,"optional",&local_30);
  if (cVar5 == '\0') {
LAB_0080bfa7:
    CVar2 = (CriterionLambda)0x0;
  }
  else {
    CVar2 = local_30;
    if ((short)local_28 != 6) {
      if ((short)local_28 == 5) {
        CVar2 = (CriterionLambda)(CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)) != 0);
      }
      else {
        if ((short)local_28 != 1) {
          if ((short)local_28 == 0x20) {
                    /* try { // try from 0080c2fe to 0080c303 has its CatchHandler @ 0080c8b8 */
            (**(code **)(*g_pScriptVM + 0x9c))(g_pScriptVM,&local_30);
          }
          goto LAB_0080bfa7;
        }
        CVar2 = (CriterionLambda)((float)CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)) != 0.0);
      }
    }
  }
  if (((uint)local_28 & 0x10000) != 0) {
    free((void *)CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)));
  }
  local_30 = (CriterionLambda)0x0;
  uStack_2f = 0;
  uStack_2e = 0;
  local_28 = (undefined4 *)0x0;
                    /* try { // try from 0080bfeb to 0080c059 has its CatchHandler @ 0080c8ce */
  cVar5 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,*(undefined4 *)param_2,"weight",&local_30);
  if (cVar5 == '\0') {
LAB_0080c05a:
    local_70 = 1.0;
  }
  else {
    switch((uint)local_28 & 0xffff) {
    default:
      local_70 = 0.0;
      break;
    case 1:
      local_70 = (float)CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30));
      break;
    case 5:
    case 7:
      iVar6 = (int)(float)CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30));
      if ((short)local_28 == 5) {
        iVar6 = CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30));
      }
      local_70 = (float)iVar6;
      break;
    case 0x22:
      local_70 = (float)CONCAT44(fStack_2c,CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)));
      if ((int)fStack_2c < 0) {
        local_70 = local_70 + 1.8446744e+19;
      }
      break;
    case 0x23:
      local_70 = (float)(double)CONCAT44(fStack_2c,CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)))
      ;
      break;
    case 0x26:
      local_70 = (float)CONCAT11(uStack_2f,local_30) + (float)uStack_2e * 65536.0;
    }
    if (local_70 <= 0.0) {
      Warning("Criterion specified invalid weight %f, overriding to 1\n",(double)local_70);
      goto LAB_0080c05a;
    }
  }
  if (((uint)local_28 & 0x10000) != 0) {
    free((void *)CONCAT22(uStack_2e,CONCAT11(uStack_2f,local_30)));
  }
  local_60[0] = (void *)0x0;
  local_56 = 0;
  local_58 = 0;
                    /* try { // try from 0080c0aa to 0080c0dc has its CatchHandler @ 0080c8ca */
  cVar5 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,*(undefined4 *)param_2,"func",local_60);
  if (cVar5 != '\0') {
    if (local_58 == 0x20) {
      if ((AddCriterionFromScript(rr2::CRuleBuilder&,CScriptAutoRef_const&)::sym_dummy == '\0') &&
         (iVar6 = __cxa_guard_acquire(&AddCriterionFromScript(rr2::CRuleBuilder&,CScriptAutoRef_const&)
                                       ::sym_dummy), iVar6 != 0)) {
        uVar10 = CONCAT44("DUMMY_FACT_NOT_USED",*(int *)(param_1 + 8) + 4);
                    /* try { // try from 0080c5a3 to 0080c5a7 has its CatchHandler @ 0080c896 */
        CUtlSymbolTable::AddString((char *)&local_3c);
        AddCriterionFromScript(rr2::CRuleBuilder&,CScriptAutoRef_const&)::sym_dummy = local_3c;
        __cxa_guard_release(&AddCriterionFromScript(rr2::CRuleBuilder&,CScriptAutoRef_const&)::
                             sym_dummy,uVar10);
      }
      pvVar4 = local_60[0];
                    /* try { // try from 0080c33a to 0080c33e has its CatchHandler @ 0080c8ca */
      puVar7 = ::operator_new(0x14);
      puVar7[1] = 1;
      *(undefined1 *)(puVar7 + 2) = 0x10;
      *puVar7 = &PTR__CScriptFunctionCriterion_00ccad10;
      puVar7[3] = 0;
      if (pvVar4 != (void *)0x0) {
                    /* try { // try from 0080c36e to 0080c370 has its CatchHandler @ 0080c8a6 */
        uVar9 = (**(code **)(*g_pScriptVM + 0x40))(g_pScriptVM,pvVar4);
        puVar7[3] = uVar9;
      }
      uVar3 = AddCriterionFromScript(rr2::CRuleBuilder&,CScriptAutoRef_const&)::sym_dummy;
      puVar7[4] = 0;
      local_30 = SUB21(uVar3,0);
      uStack_2f = (undefined1)(uVar3 >> 8);
      LOCK();
      puVar7[1] = puVar7[1] + 1;
      UNLOCK();
      fStack_2c = 1.0;
      local_28 = puVar7;
                    /* try { // try from 0080c3c6 to 0080c3ca has its CatchHandler @ 0080c855 */
      rr2::CRuleBuilder::AddCriterion(param_1,&local_30,true);
      rr2::CriterionLambda::~CriterionLambda(&local_30);
                    /* try { // try from 0080c3e1 to 0080c3e6 has its CatchHandler @ 0080c8ca */
      (**(code **)(*g_pScriptVM + 0x9c))(g_pScriptVM,local_60);
      uVar9 = 1;
    }
    else {
      pcVar8 = "unknown_variant_type";
      if (local_58 < 0x29) {
        pcVar8 = *(char **)(CSWTCH_760 + (uint)local_58 * 4);
      }
      Warning("criterion has a \'func\' field with inappropriate type %s, rejecting.\n",pcVar8);
      uVar9 = 0;
    }
    goto LAB_0080c0df;
  }
  local_4c = 0;
  local_4a = 0;
  local_40 = 0;
  local_3e = 0;
  local_32 = 0;
  local_54[0] = (void *)0x0;
  local_48 = (char *)0x0;
  local_34 = 0;
  local_3c = 0;
  uStack_3a = 0;
                    /* try { // try from 0080c174 to 0080c267 has its CatchHandler @ 0080c871 */
  cVar5 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,*(undefined4 *)param_2,"key",local_54);
  if (cVar5 == '\0') {
    Warning("criterion doesn\'t have a \'key\' field, rejecting\n");
LAB_0080c1ca:
    uVar9 = 0;
  }
  else {
    cVar5 = (**(code **)(*g_pScriptVM + 0x90))
                      (g_pScriptVM,*(undefined4 *)param_2,"bottom",&local_48);
    if (cVar5 == '\0') {
      Warning("criterion doesn\'t have a \'bottom\' field, rejecting\n");
      goto LAB_0080c1ca;
    }
                    /* try { // try from 0080c442 to 0080c559 has its CatchHandler @ 0080c871 */
    uVar9 = (**(code **)(*g_pScriptVM + 0x90))(g_pScriptVM,*(undefined4 *)param_2,"top",&local_3c);
    pcVar8 = local_48;
    if ((char)uVar9 == '\0') {
                    /* try { // try from 0080c5d7 to 0080c825 has its CatchHandler @ 0080c871 */
      Warning("criterion doesn\'t have a \'top\' field, rejecting\n");
      goto LAB_0080c1ca;
    }
    if (local_4c != 0x1f) {
      pcVar8 = "unknown_variant_type";
      if (local_58 < 0x29) {
        pcVar8 = *(char **)(CSWTCH_760 + (uint)local_58 * 4);
      }
      Warning("criterion specified invalid key of type %s\n",pcVar8);
      goto LAB_0080c1ca;
    }
    if (local_40 == 0x1f) {
      if (local_34 == 0x1f) {
        pcVar1 = (char *)CONCAT22(uStack_3a,local_3c);
        iVar6 = _V_strcmp(local_48,pcVar1);
        if (iVar6 == 0) {
          CUtlSymbolTable::AddString((char *)&local_66);
          CUtlSymbolTable::AddString(local_64);
          local_30 = local_64[0];
          uStack_2f = local_64[1];
          local_28 = (undefined4 *)((uint)local_28 & 0xfffffff8 | 2);
          local_24 = (char *)(uint)local_66;
          local_20 = local_24;
          goto LAB_0080c544;
        }
        Warning("criterion specifies a \'bottom\' of %s and a \'top\' of %s; string range queries are not supported\n"
                ,pcVar8,pcVar1);
      }
      else {
        pcVar8 = "unknown_variant_type";
        if (local_34 < 0x29) {
          pcVar8 = *(char **)(CSWTCH_760 + (uint)local_34 * 4);
        }
        Warning("criterion has a \'bottom\' field that\'s a string and a \'top\' field that\'s a %s, this is meaningless\n"
                ,pcVar8);
      }
      goto LAB_0080c1ca;
    }
    if (local_40 == 0) {
      local_84 = (char *)0xff7fffff;
    }
    else {
      switch(local_40) {
      case 1:
        local_84 = local_48;
        break;
      default:
        local_84 = (char *)0x0;
        break;
      case 5:
      case 7:
        pcVar8 = (char *)(int)(float)local_48;
        if (local_40 == 5) {
          pcVar8 = local_48;
        }
        local_84 = (char *)(float)(int)pcVar8;
        break;
      case 0x22:
        local_84 = (char *)((float)CONCAT44(iStack_44,local_48) + 1.8446744e+19);
        if (-1 < iStack_44) {
          local_84 = (char *)(float)CONCAT44(iStack_44,local_48);
        }
        break;
      case 0x23:
        local_84 = (char *)(float)(double)CONCAT44(iStack_44,local_48);
        break;
      case 0x26:
        local_84 = (char *)((float)((uint)local_48 & 0xffff) +
                           (float)((uint)local_48 >> 0x10) * 65536.0);
      }
    }
    if (local_34 == 0) {
      local_88 = (char *)0x7f7fffff;
    }
    else {
      switch(local_34) {
      case 1:
        local_88 = (char *)CONCAT22(uStack_3a,local_3c);
        break;
      default:
        local_88 = (char *)0x0;
        break;
      case 5:
      case 7:
        iVar6 = (int)(float)CONCAT22(uStack_3a,local_3c);
        if (local_34 == 5) {
          iVar6 = CONCAT22(uStack_3a,local_3c);
        }
        local_88 = (char *)(float)iVar6;
        break;
      case 0x22:
        pcVar8 = (char *)(float)CONCAT44(iStack_38,CONCAT22(uStack_3a,local_3c));
        local_88 = (char *)((float)pcVar8 + 1.8446744e+19);
        if (-1 < iStack_38) {
          local_88 = pcVar8;
        }
        break;
      case 0x23:
        local_88 = (char *)(float)(double)CONCAT44(iStack_38,CONCAT22(uStack_3a,local_3c));
        break;
      case 0x26:
        local_88 = (char *)((float)local_3c + (float)uStack_3a * 65536.0);
      }
    }
    CUtlSymbolTable::AddString(local_62);
    local_30 = local_62[0];
    uStack_2f = local_62[1];
    local_24 = local_84;
    local_20 = local_88;
    local_28 = (undefined4 *)((uint)local_28 & 0xfffffff9 | 1);
LAB_0080c544:
    fStack_2c = local_70;
    rr2::CRuleBuilder::AddCriterion(param_1,(CriterionStatic *)&local_30,(bool)((byte)CVar2 ^ 1));
  }
  if ((local_32 & 1) != 0) {
    free((void *)CONCAT22(uStack_3a,local_3c));
    local_32 = local_32 & 0xfffe;
  }
  local_3c = 0;
  uStack_3a = 0;
  iStack_38 = 0;
  local_34 = 0;
  if ((local_3e & 1) != 0) {
    free(local_48);
    local_3e = local_3e & 0xfffe;
  }
  local_48 = (char *)0x0;
  iStack_44 = 0;
  local_40 = 0;
  if ((local_4a & 1) != 0) {
    free(local_54[0]);
  }
LAB_0080c0df:
  if ((local_56 & 1) != 0) {
    free(local_60[0]);
  }
  return uVar9;
}

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)