From e57faeb8cfc5fe16210161835f1e5b69190d96c6 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 26 Sep 2018 12:13:34 +0000 Subject: [PATCH] pass node information to sign update function, remove all entities on update incase of rogue --- init.lua | 218 +++++++++++++++++++++++-------------------------------- 1 file changed, 91 insertions(+), 127 deletions(-) diff --git a/init.lua b/init.lua index d181121..b8b4db5 100644 --- a/init.lua +++ b/init.lua @@ -40,55 +40,33 @@ local wall_dir_change = { signs_lib.wallmounted_rotate = function(pos, node, user, mode) if mode ~= screwdriver.ROTATE_FACE then return false end minetest.swap_node(pos, { name = node.name, param2 = wall_dir_change[node.param2 % 6] }) - for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do - local e = v:get_luaentity() - if e and e.name == "signs:text" then - v:remove() - end - end - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) return true end signs_lib.facedir_rotate = function(pos, node, user, mode) if mode ~= screwdriver.ROTATE_FACE then return false end - newparam2 = (node.param2 %8) + 1 + local newparam2 = (node.param2 %8) + 1 if newparam2 == 5 then newparam2 = 6 elseif newparam2 > 6 then newparam2 = 0 end minetest.swap_node(pos, { name = node.name, param2 = newparam2 }) - for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do - local e = v:get_luaentity() - if e and e.name == "signs:text" then - v:remove() - end - end - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) return true end signs_lib.facedir_rotate_simple = function(pos, node, user, mode) if mode ~= screwdriver.ROTATE_FACE then return false end - newparam2 = (node.param2 %8) + 1 + local newparam2 = (node.param2 %8) + 1 if newparam2 > 3 then newparam2 = 0 end minetest.swap_node(pos, { name = node.name, param2 = newparam2 }) - for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do - local e = v:get_luaentity() - if e and e.name == "signs:text" then - v:remove() - end - end - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) return true end - - - - signs_lib.modpath = minetest.get_modpath("signs_lib") local DEFAULT_TEXT_SCALE = {x=0.8, y=0.5} @@ -206,15 +184,15 @@ default_sign_metal_image = "default_sign_steel.png" --table copy function signs_lib.table_copy(t) - local nt = { }; - for k, v in pairs(t) do - if type(v) == "table" then - nt[k] = signs_lib.table_copy(v) - else - nt[k] = v - end - end - return nt + local nt = { } + for k, v in pairs(t) do + if type(v) == "table" then + nt[k] = signs_lib.table_copy(v) + else + nt[k] = v + end + end + return nt end -- infinite stacks @@ -512,7 +490,7 @@ local function set_obj_text(obj, text, new, pos) end signs_lib.construct_sign = function(pos, locked) - local meta = minetest.get_meta(pos) + local meta = minetest.get_meta(pos) meta:set_string( "formspec", "size[6,4]".. @@ -523,13 +501,13 @@ signs_lib.construct_sign = function(pos, locked) end signs_lib.destruct_sign = function(pos) - local objects = minetest.get_objects_inside_radius(pos, 0.5) - for _, v in ipairs(objects) do + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, v in ipairs(objects) do local e = v:get_luaentity() - if e and e.name == "signs:text" then - v:remove() - end - end + if e and e.name == "signs:text" then + v:remove() + end + end end local function make_infotext(text) @@ -542,7 +520,7 @@ local function make_infotext(text) return table.concat(lines2, "\n") end -signs_lib.update_sign = function(pos, fields, owner) +signs_lib.update_sign = function(pos, fields, owner, node) -- First, check if the interact keyword from CWz's mod is being set, -- or has been changed since the last restart... @@ -586,28 +564,14 @@ signs_lib.update_sign = function(pos, fields, owner) else new = (meta:get_int("__signslib_new_format") ~= 0) end + signs_lib.destruct_sign(pos) local text = meta:get_string("text") - if text == nil then return end - local objects = minetest.get_objects_inside_radius(pos, 0.5) - local found - for _, v in ipairs(objects) do - local e = v:get_luaentity() - if e and e.name == "signs:text" then - if found then - v:remove() - else - set_obj_text(v, text, new, pos) - found = true - end - end - end - if found then - return - end + if text == nil or text == "" then return end + +if node then print ("---", node.name, node.param2) end - -- if there is no entity local sign_info - local signnode = minetest.get_node(pos) + local signnode = node or minetest.get_node(pos) local signname = signnode.name local textpos = minetest.registered_nodes[signname].textpos if textpos then @@ -764,52 +728,52 @@ minetest.register_node(":"..default_sign, { signs_lib.receive_fields(pos, formname, fields, sender) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, on_rotate = signs_lib.wallmounted_rotate }) minetest.register_node(":signs:sign_yard", { - paramtype = "light", + paramtype = "light", sunlight_propagates = true, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = signs_lib.yard_sign_model.nodebox, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = signs_lib.yard_sign_model.nodebox, selection_box = { type = "fixed", fixed = {-0.4375, -0.5, -0.0625, 0.4375, 0.375, 0} }, - tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, - groups = {choppy=2, dig_immediate=2}, - drop = default_sign, + tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, + groups = {choppy=2, dig_immediate=2}, + drop = default_sign, - on_construct = function(pos) - signs_lib.construct_sign(pos) - end, - on_destruct = function(pos) - signs_lib.destruct_sign(pos) - end, + on_construct = function(pos) + signs_lib.construct_sign(pos) + end, + on_destruct = function(pos) + signs_lib.destruct_sign(pos) + end, on_receive_fields = function(pos, formname, fields, sender) signs_lib.receive_fields(pos, formname, fields, sender) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, on_rotate = signs_lib.facedir_rotate_simple }) minetest.register_node(":signs:sign_hanging", { - paramtype = "light", + paramtype = "light", sunlight_propagates = true, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = signs_lib.hanging_sign_model.nodebox, - selection_box = { + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = signs_lib.hanging_sign_model.nodebox, + selection_box = { type = "fixed", fixed = {-0.45, -0.275, -0.049, 0.45, 0.5, 0.049} }, - tiles = { + tiles = { "signs_hanging_top.png", "signs_hanging_bottom.png", "signs_hanging_side.png", @@ -817,31 +781,31 @@ minetest.register_node(":signs:sign_hanging", { "signs_hanging_back.png", "signs_hanging_front.png" }, - groups = {choppy=2, dig_immediate=2}, - drop = default_sign, + groups = {choppy=2, dig_immediate=2}, + drop = default_sign, - on_construct = function(pos) - signs_lib.construct_sign(pos) - end, - on_destruct = function(pos) - signs_lib.destruct_sign(pos) - end, + on_construct = function(pos) + signs_lib.construct_sign(pos) + end, + on_destruct = function(pos) + signs_lib.destruct_sign(pos) + end, on_receive_fields = function(pos, formname, fields, sender) signs_lib.receive_fields(pos, formname, fields, sender) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, on_rotate = signs_lib.facedir_rotate_simple }) minetest.register_node(":signs:sign_post", { - paramtype = "light", + paramtype = "light", sunlight_propagates = true, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = signs_lib.sign_post_model.nodebox, - tiles = { + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = signs_lib.sign_post_model.nodebox, + tiles = { "signs_post_top.png", "signs_post_bottom.png", "signs_post_side.png", @@ -849,14 +813,14 @@ minetest.register_node(":signs:sign_post", { "signs_post_back.png", "signs_post_front.png", }, - groups = {choppy=2, dig_immediate=2}, - drop = { + groups = {choppy=2, dig_immediate=2}, + drop = { max_items = 2, items = { { items = { default_sign }}, { items = { "default:fence_wood" }}, }, - }, + }, on_rotate = signs_lib.facedir_rotate_simple }) @@ -896,7 +860,7 @@ minetest.register_node(":locked_sign:sign_wall_locked", { signs_lib.receive_fields(pos, formname, fields, sender, true) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, can_dig = function(pos, player) local meta = minetest.get_meta(pos) @@ -937,7 +901,7 @@ if minetest.registered_nodes["default:sign_wall_steel"] then signs_lib.receive_fields(pos, formname, fields, sender) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, on_rotate = signs_lib.wallmounted_rotate }) @@ -991,7 +955,7 @@ if enable_colored_metal_signs then signs_lib.receive_fields(pos, formname, fields, sender) end, on_punch = function(pos, node, puncher) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end, on_rotate = signs_lib.facedir_rotate }) @@ -1012,9 +976,9 @@ signs_text_on_activate = function(self) end minetest.register_entity(":signs:text", { - collisionbox = { 0, 0, 0, 0, 0, 0 }, - visual = "upright_sprite", - textures = {}, + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, on_activate = signs_text_on_activate, }) @@ -1022,17 +986,17 @@ minetest.register_entity(":signs:text", { -- And the good stuff here! :-) function signs_lib.register_fence_with_sign(fencename, fencewithsignname) - local def = minetest.registered_nodes[fencename] - local def_sign = minetest.registered_nodes[fencewithsignname] - if not (def and def_sign) then - minetest.log("warning", "[signs_lib] "..S("Attempt to register unknown node as fence")) - return - end - def = signs_lib.table_copy(def) - def_sign = signs_lib.table_copy(def_sign) - fences_with_sign[fencename] = fencewithsignname + local def = minetest.registered_nodes[fencename] + local def_sign = minetest.registered_nodes[fencewithsignname] + if not (def and def_sign) then + minetest.log("warning", "[signs_lib] "..S("Attempt to register unknown node as fence")) + return + end + def = signs_lib.table_copy(def) + def_sign = signs_lib.table_copy(def_sign) + fences_with_sign[fencename] = fencewithsignname - def_sign.on_place = function(itemstack, placer, pointed_thing, ...) + def_sign.on_place = function(itemstack, placer, pointed_thing, ...) local node_above = minetest.get_node_or_nil(pointed_thing.above) local node_under = minetest.get_node_or_nil(pointed_thing.under) local def_above = node_above and minetest.registered_nodes[node_above.name] @@ -1077,16 +1041,16 @@ function signs_lib.register_fence_with_sign(fencename, fencewithsignname) signs_lib.receive_fields(pos, formname, fields, sender) end def_sign.on_punch = function(pos, node, puncher, ...) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end local fencename = fencename def_sign.after_dig_node = function(pos, node, ...) - node.name = fencename - minetest.add_node(pos, node) + node.name = fencename + minetest.add_node(pos, node) end def_sign.on_rotate = signs_lib.facedir_rotate_simple - def_sign.drop = default_sign + def_sign.drop = default_sign minetest.register_node(":"..fencename, def) minetest.register_node(":"..fencewithsignname, def_sign) table.insert(signs_lib.sign_node_list, fencewithsignname) @@ -1109,18 +1073,18 @@ minetest.register_lbm({ label = "Restore sign text", run_at_every_load = true, action = function(pos, node) - signs_lib.update_sign(pos) + signs_lib.update_sign(pos,nil,nil,node) end }) -- locked sign minetest.register_craft({ - output = "locked_sign:sign_wall_locked", - recipe = { - {default_sign}, - {"default:steel_ingot"}, - }, + output = "locked_sign:sign_wall_locked", + recipe = { + {default_sign}, + {"default:steel_ingot"}, + }, }) -- craft recipes for the metal signs