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 intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.