diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua index 791e1fb2..711f0435 100644 --- a/res/layouts/console.xml.lua +++ b/res/layouts/console.xml.lua @@ -52,6 +52,22 @@ function submit(text) add_to_history(text) setup_variables() + text = text:trim() + local name + for s in text:gmatch("%S+") do + name = s + break + end + if name == nil then + name = text + end + if not rules.get("cheat-commands") and table.has(console.cheats, name) then + console.log("cheat commands are disabled") + document.prompt.text = "" + document.prompt.focused = true + return + end + document.log.caret = -1 local status, result = pcall(console.execute, text) if result then diff --git a/res/scripts/stdcmd.lua b/res/scripts/stdcmd.lua index 6dec6ca4..1df86dd6 100644 --- a/res/scripts/stdcmd.lua +++ b/res/scripts/stdcmd.lua @@ -28,17 +28,17 @@ console.add_command( function(args, kwargs) local name = args[1] if #name == 0 then - local commands = console.get_commands_list() table.sort(commands) local str = "Available commands:" for i,k in ipairs(commands) do - str = str .. "\n " .. build_scheme(console.get_command_info(k)) + if rules.get("cheat-commands") or not table.has(console.cheats, k) then + str = str .. "\n " .. build_scheme(console.get_command_info(k)) + end end return str .. "\nuse 'help '" - end local command = console.get_command_info(name) @@ -223,3 +223,45 @@ console.add_command( fragment:place({x, y, z}, rotation) end ) + +console.add_command( + "rule.set name:str value:bool", + "Set rule value", + function(args, kwargs) + local name = args[1] + local value = args[2] + rules.set(name, value) + return "rule '"..name.."' set to "..tostring(value) + end +) + +console.add_command( + "rule.list", + "Show registered rules list", + function(args, kwargs) + local names = "" + for name, rule in pairs(rules.rules) do + if #names > 0 then + names = names .. "\n " + else + names = " " + end + local value = rule.value + if value == nil then + value = "not set" + end + names = names .. name .. ":\t" .. tostring(value) + end + return "registered rules:\n" .. names + end +) + +console.cheats = { + "blocks.fill", + "tp", + "fragment.place", + "time.set", + "time.daycycle", + "entity.despawn", + "player.respawn" +} diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 8a4f3513..c9cef6dd 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -103,6 +103,9 @@ function time.post_runnable(runnable) table.insert(__post_runnables, runnable) end +--- Console library extension --- +console.cheats = {} + local log_element = Document.new("core:console").log function console.log(...) local args = {...} @@ -168,6 +171,119 @@ end math.randomseed(time.uptime() * 1536227939) +rules = {nexid = 1, rules = {}} +local _rules = rules + +function _rules.get_rule(name) + local rule = _rules.rules[name] + if rule == nil then + rule = {listeners={}} + _rules.rules[name] = rule + end + return rule +end + +function _rules.get(name) + local rule = _rules.rules[name] + if rule == nil then + return nil + end + return rule.value +end + +function _rules.set(name, value) + local rule = _rules.get_rule(name) + rule.value = value + for _, handler in pairs(rule.listeners) do + handler(value) + end +end + +function _rules.reset(name) + local rule = _rules.get_rule(name) + _rules.set(rule.default) +end + +function _rules.listen(name, handler) + local rule = _rules.get_rule(name) + local id = _rules.nexid + _rules.nextid = _rules.nexid + 1 + rule.listeners[utf8.encode(id)] = handler + return id +end + +function _rules.create(name, value, handler) + local rule = _rules.get_rule(name) + rule.default = value + + local handlerid + if handler ~= nil then + handlerid = _rules.listen(name, handler) + end + if _rules.get(name) == nil then + _rules.set(name, value) + else + handler(_rules.get(name)) + end + return handlerid +end + +function _rules.unlisten(name, id) + local rule = _rules.get_rule(name) + rule.listeners[utf8.encode(id)] = nil +end + +function _rules.clear() + _rules.rules = {} + _rules.nextid = 1 + + _rules.create("cheat-commands", true) +end + +function __vc_create_hud_rules() + _rules.create("show-content-access", hud._is_content_access(), function(value) + hud._set_content_access(value) + end) + _rules.create("allow-flight", true, function(value) + input.set_enabled("player.flight", value) + end) + _rules.create("allow-noclip", true, function(value) + input.set_enabled("player.noclip", value) + end) + _rules.create("allow-destruct", true, function(value) + input.set_enabled("player.attack", value) + end) + _rules.create("allow-cheat-movement", true, function(value) + input.set_enabled("movement.cheat", value) + end) + _rules.create("allow-debug-cheats", true, function(value) + hud._set_debug_cheats(value) + end) +end + +local RULES_FILE = "world:rules.toml" +function __vc_on_world_open() + if not file.exists(RULES_FILE) then + return + end + local rule_values = toml.parse(file.read(RULES_FILE)) + for name, value in pairs(rule_values) do + _rules.set(name, value) + end +end + +function __vc_on_world_save() + local rule_values = {} + for name, rule in pairs(rules.rules) do + rule_values[name] = rule.value + end + file.write(RULES_FILE, toml.tostring(rule_values)) +end + +function __vc_on_world_quit() + _rules.clear() +end + -- --------- Deprecated functions ------ -- local function wrap_deprecated(func, name, alternatives) return function (...) diff --git a/src/engine.cpp b/src/engine.cpp index c5bae880..85a9e42b 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -360,7 +360,7 @@ void Engine::loadContent() { for (auto& pack : contentPacks) { ContentLoader(&pack, contentBuilder, *resPaths).load(); load_configs(pack.folder); - } + } content = contentBuilder.build(); @@ -421,8 +421,6 @@ double Engine::getDelta() const { } void Engine::setScreen(std::shared_ptr screen) { - // unblock all bindings - Events::enableBindings(); // reset audio channels (stop all sources) audio::reset_channel(audio::get_channel_index("regular")); audio::reset_channel(audio::get_channel_index("ambient")); diff --git a/src/frontend/debug_panel.cpp b/src/frontend/debug_panel.cpp index cd0869b1..b3d6aca0 100644 --- a/src/frontend/debug_panel.cpp +++ b/src/frontend/debug_panel.cpp @@ -42,7 +42,8 @@ static std::shared_ptr