Описание: бог знает как такое обьяснить, но можно создавать условия по средствам массива (Можно будет сделать NoCode создание правил/условий для скриптов)
Из минусов нет проверки на существование условного ".name" у обьекта и не поддерживает группы правил в группах правил (Рекурсия не работала, бог знает с чем связано), а еще там всякие штуки с пустым массивом, вообще просто как пример
Из минусов нет проверки на существование условного ".name" у обьекта и не поддерживает группы правил в группах правил (Рекурсия не работала, бог знает с чем связано), а еще там всякие штуки с пустым массивом, вообще просто как пример
Если вкратце представляет вот такое:
В виде условия на луа, то есть из массива сверху получится примерно это
Но при этом сразу выдает вам true или false
Lua:
local my_rule = {
between_groups = "or",
{index = "name", operator = "equals", value = "Popa Murav`ya", oper = "or"}, -- oper = "or" тут ни на что не влияет, так как это первое правило
{
{index = "name", operator = "contains", value = "Code",oper = "and"}, -- oper = "and" тут ни на что не влияет, так как это первое правило в группе-правил
{index = "top", operator = "is", value = true, oper = "and"}
},
{
{index = "name", operator = "equals", value = "Admin",oper = "and"}, -- не влияет
{index = "donate", operator = "equals", value = true, oper = "and"},
},
{index = "sex", operator = "equals", value = "Yes", oper = "or"} -- тут уже влияет
}
В виде условия на луа, то есть из массива сверху получится примерно это
Lua:
-- obj - наш обьект
-- obj.name.contains нет луа(или я не видел, поэтому это своя функция, не важно)
if obj.name == "Popa Murav`ya" or (obj.name.contains("Code") and obj.top == true) or (obj.name == "Admin" and obj.donate == true) or obj.sex == "Yes" then
--code
end
Lua:
local operators = {
equals = function (a, b) return a == b end,
not_equals = function (a, b) return a ~= b end,
is = function (a, b) return a == b end,
greater= function (a, b) return a > b end,
less = function (a, b) return a < b end,
equals_or_less = function (a, b) return a <= b end,
equals_or_greater = function (a, b) return a >= b end,
contains = function (a, b)
if type(a) == "table" then
for _, v in pairs(a) do
if v == b then return true end
end
return false
elseif type(a) == "string" then
return a:find(b) and true or false -- так надо чтобы красиво были бул только
else
return false
end
end,
}
function GenerateCondition(rule, object)
local condition = nil
for k, v in pairs(rule) do
if type(v) == "table" then
if #v == 0 then
local rule_condition = operators[v['operator']](object[v['index']], v['value'])
if not condition then
condition = rule_condition
else
condition = v['oper'] == "or" and (rule_condition or condition) or (rule_condition and condition)
end
else
local group_condition = nil
for m_k, m_v in pairs(v) do
if type(m_v) ~= "string" then
local rule_condition = operators[m_v['operator']](object[m_v['index']], m_v['value'])
if group_condition == nil then
group_condition = rule_condition
else
group_condition = m_v['oper'] == "or" and (rule_condition or group_condition) or (rule_condition and group_condition)
end
end
end
if not condition then
condition = group_condition
else
condition = (rule['between_groups'] == "or" and (group_condition or condition) or (group_condition and condition))
end
end
end
end
return condition
end
Lua:
local my_mini_object = {
name = "Admin",
level = 5,
donate = true,
top = false,
sex = "Yes"
}
local my_mini_object2 = {
name = "Yuriy Code",
level = 7,
donate = true,
top = true,
sex = "No"
}
local my_mini_object3 = {
name = "Popa Murav`y сode",
level = 1,
donate = true,
top = true,
sex = "No"
}
local my_rule = {
between_groups = "or",
{index = "name", operator = "equals", value = "Popa Murav`ya", oper = "or"}, -- oper = "or" тут ни на что не влияет, так как это первое правило
{
{index = "name", operator = "contains", value = "Code",oper = "and"}, -- oper = "and" тут ни на что не влияет, так как это первое правило в группе-правил
{index = "top", operator = "is", value = true, oper = "and"}
},
{
{index = "name", operator = "equals", value = "Admin",oper = "and"}, -- не влияет
{index = "donate", operator = "equals", value = true, oper = "and"},
},
{index = "sex", operator = "equals", value = "Yes", oper = "or"} -- тут уже влияет
}
if GenerateCondition(my_rule, my_mini_object) then
print("1st true") -- true, потому-что Админ + donate, а так-же sex = "Yes"
else
print("1st false")
end
print(GenerateCondition(my_rule, my_mini_object2)) -- true (Потому-что name содержит Code и top = true
print(GenerateCondition(my_rule, my_mini_object3)) -- false (code написан в нижнем регистре)