From 76a384044e1b3dfd5be9e76f7f638ffa7bf4fae7 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 13 Jan 2019 21:46:53 +0100 Subject: [PATCH] Support for Lua functions added --- releasenotes.md | 17 +++++++-- safer_lua/environ.lua | 3 ++ safer_lua/scanner.lua | 2 +- sl_controller/controller.lua | 72 ++++++++++++++++++++++++------------ 4 files changed, 66 insertions(+), 28 deletions(-) diff --git a/releasenotes.md b/releasenotes.md index 4d80ec0..1600d43 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,8 +1,21 @@ # Release Notes for ModPack TechPack [techpack] +## V2.00.01 (2019-01-13) -## V2.00.00(2019-01-12) +### Additions +- SaferLua-Controller: Support for Lua functions added +- Warehouse Boxes: Formspec tooltips added + +### Removals + +### Changes +- Grinder: Recipes for clay changed + + + + +## V2.00.00 (2019-01-12) ### Additions - Almost all machines break after a certain amount of time (switch into the state 'defect') and have to be repaired. @@ -12,7 +25,6 @@ - Industrial lamps added - Warehouse Boxes in steel, copper, and gold for your warehouse/stock (techpack_warehouse) added - ### Removals ### Changes @@ -27,7 +39,6 @@ - SmartLine Controller adapter to the new state 'defect' - Gravel Sieve: Ore probability calculation changed (thanks to obl3pplifp) - ### Fixes diff --git a/safer_lua/environ.lua b/safer_lua/environ.lua index 4c743f5..5ecf1b7 100644 --- a/safer_lua/environ.lua +++ b/safer_lua/environ.lua @@ -61,6 +61,9 @@ function safer_lua.config(max_code_size, max_table_size) end local function format_error(err, tab) + if err:find("stack overflow") then + return "Error: Stack overflow due to recursive function calls!" + end err = err:gsub('%[string "%-%-.-"%]:', "in "..tab.." line ") err = err:gsub('in main chunk.+', "") err = err:gsub('%.%.%..-:%d+:', "Error") diff --git a/safer_lua/scanner.lua b/safer_lua/scanner.lua index 117c580..e4a890d 100644 --- a/safer_lua/scanner.lua +++ b/safer_lua/scanner.lua @@ -80,7 +80,7 @@ local InvalidKeywords = { ["repeat"] = true, ["until"] = true, ["for"] = true, - ["function"] = true, + --["function"] = true, ["_G"] = true, ["__load"] = true, ["__dump"] = true, diff --git a/sl_controller/controller.lua b/sl_controller/controller.lua index 5650dee..305625d 100644 --- a/sl_controller/controller.lua +++ b/sl_controller/controller.lua @@ -153,7 +153,7 @@ local function formspec1(meta) default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "tabheader[0,0;tab;init,loop,outp,notes,help;1;;true]".. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;1;;true]".. "textarea[0.3,0.2;10,8.3;init;function init();"..init.."]".. "label[0,7.3;end]".. "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. @@ -164,15 +164,14 @@ end local function formspec2(meta) local state = meta:get_int("state") == tubelib.RUNNING local cmnd = state and "stop;Stop" or "start;Start" - local loop = meta:get_string("loop") - loop = minetest.formspec_escape(loop) + local func = meta:get_string("func") + func = minetest.formspec_escape(func) return "size[10,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "tabheader[0,0;tab;init,loop,outp,notes,help;2;;true]".. - "textarea[0.3,0.2;10,8.3;loop;function loop(ticks, elapsed);"..loop.."]".. - "label[0,7.3;end]".. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;2;;true]".. + "textarea[0.3,0.2;10,8.3;func;functions:;"..func.."]".. "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. "button[6.3,7.5;1.8,1;save;Save]".. "button[8.2,7.5;1.8,1;"..cmnd.."]" @@ -181,39 +180,57 @@ end local function formspec3(meta) local state = meta:get_int("state") == tubelib.RUNNING local cmnd = state and "stop;Stop" or "start;Start" - local output = meta:get_string("output") - output = minetest.formspec_escape(output) + local loop = meta:get_string("loop") + loop = minetest.formspec_escape(loop) return "size[10,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "tabheader[0,0;tab;init,loop,outp,notes,help;3;;true]".. - "textarea[0.3,0.2;10,8.3;help;Output:;"..output.."]".. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;3;;true]".. + "textarea[0.3,0.2;10,8.3;loop;function loop(ticks, elapsed);"..loop.."]".. + "label[0,7.3;end]".. + "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. + "button[6.3,7.5;1.8,1;save;Save]".. + "button[8.2,7.5;1.8,1;"..cmnd.."]" +end + +local function formspec4(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local output = meta:get_string("output") + output = minetest.formspec_escape(output) + output = output:gsub("\n", ",") + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;4;;true]".. + "table[0.2,0.2;9.5,7;output;"..output..";]".. "button[4.4,7.5;1.8,1;clear;Clear]".. "button[6.3,7.5;1.8,1;update;Update]".. "button[8.2,7.5;1.8,1;"..cmnd.."]" end -local function formspec4(meta) +local function formspec5(meta) local notes = meta:get_string("notes") notes = minetest.formspec_escape(notes) return "size[10,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "tabheader[0,0;tab;init,loop,outp,notes,help;4;;true]".. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;5;;true]".. "textarea[0.3,0.2;10,8.3;notes;Notepad:;"..notes.."]".. "button_exit[6.3,7.5;1.8,1;cancel;Cancel]".. "button[8.2,7.5;1.8,1;save;Save]" end -local function formspec5(items, pos, text) +local function formspec6(items, pos, text) text = minetest.formspec_escape(text) return "size[10,8]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "tabheader[0,0;tab;init,loop,outp,notes,help;5;;true]".. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;6;;true]".. "label[0,-0.2;Functions:]".. "dropdown[0.3,0.2;10,8.3;functions;"..items..";"..pos.."]".. "textarea[0.3,1.3;10,8;help;Help:;"..text.."]" @@ -223,21 +240,22 @@ local function error(pos, err) output(pos, err) local meta = minetest.get_meta(pos) local number = meta:get_string("number") - meta:set_string("formspec", formspec3(meta)) meta:set_string("infotext", "Controller "..number..": error") meta:set_int("state", tubelib.STOPPED) meta:set_int("running", tubelib.STATE_STOPPED) + meta:set_string("formspec", formspec4(meta)) minetest.get_node_timer(pos):stop() return false end local function compile(pos, meta, number) local init = meta:get_string("init") + local func = meta:get_string("func") local loop = meta:get_string("loop") local owner = meta:get_string("owner") local env = table.copy(tCommands) env.meta = {pos=pos, owner=owner, number=number, error=error} - local code = safer_lua.init(pos, init, loop, env, error) + local code = safer_lua.init(pos, init .."\n".. func, loop, env, error) if code then Cache[number] = {code=code, inputs={}} @@ -273,7 +291,7 @@ local function start_controller(pos) meta:set_int("state", tubelib.RUNNING) meta:set_int("running", tubelib.STATE_RUNNING) minetest.get_node_timer(pos):start(1) - meta:set_string("formspec", formspec3(meta)) + meta:set_string("formspec", formspec4(meta)) meta:set_string("infotext", "Controller "..number..": running") return true end @@ -287,7 +305,7 @@ local function stop_controller(pos) meta:set_int("running", tubelib.STATE_STOPPED) minetest.get_node_timer(pos):stop() meta:set_string("infotext", "Controller "..number..": stopped") - meta:set_string("formspec", formspec2(meta)) + meta:set_string("formspec", formspec3(meta)) end local function no_battery(pos) @@ -362,20 +380,23 @@ local function on_receive_fields(pos, formname, fields, player) if fields.init then meta:set_string("init", fields.init) meta:set_string("formspec", formspec1(meta)) + elseif fields.func then + meta:set_string("func", fields.func) + meta:set_string("formspec", formspec2(meta)) elseif fields.loop then meta:set_string("loop", fields.loop) - meta:set_string("formspec", formspec2(meta)) + meta:set_string("formspec", formspec3(meta)) elseif fields.notes then meta:set_string("notes", fields.notes) - meta:set_string("formspec", formspec4(meta)) + meta:set_string("formspec", formspec5(meta)) end end if fields.update then - meta:set_string("formspec", formspec3(meta)) + meta:set_string("formspec", formspec4(meta)) elseif fields.clear then meta:set_string("output", "") - meta:set_string("formspec", formspec3(meta)) + meta:set_string("formspec", formspec4(meta)) elseif fields.tab == "1" then meta:set_string("formspec", formspec1(meta)) elseif fields.tab == "2" then @@ -385,7 +406,9 @@ local function on_receive_fields(pos, formname, fields, player) elseif fields.tab == "4" then meta:set_string("formspec", formspec4(meta)) elseif fields.tab == "5" then - meta:set_string("formspec", formspec5(sFunctionList, 1, sHELP)) + meta:set_string("formspec", formspec5(meta)) + elseif fields.tab == "6" then + meta:set_string("formspec", formspec6(sFunctionList, 1, sHELP)) elseif fields.start == "Start" then start_controller(pos) minetest.log("action", player:get_player_name() .. @@ -396,7 +419,7 @@ local function on_receive_fields(pos, formname, fields, player) local key = fields.functions local text = tHelpTexts[key] or "" local pos = tFunctionIndex[key] or 1 - meta:set_string("formspec", formspec5(sFunctionList, pos, text)) + meta:set_string("formspec", formspec6(sFunctionList, pos, text)) end end @@ -431,6 +454,7 @@ minetest.register_node("sl_controller:controller", { meta:set_int("state", tubelib.STOPPED) meta:set_int("running", tubelib.STATE_STOPPED) meta:set_string("init", "-- called only once") + meta:set_string("func", "-- for your functions") meta:set_string("loop", "-- called every second") meta:set_string("notes", "For your notes / snippets") meta:set_string("formspec", formspec1(meta))