From dcdee222650d9a82f80ad5f446c274f068a8e230 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sun, 22 Sep 2019 03:19:31 -0400 Subject: [PATCH] allow mods to pass a function or just `true` to the pole and horiz pole check routines, in case they need their own, custom checking routines, if the usual, simple checks aren't good enough. got rid of the allowed-poles table, as it's now obsolete moved all existing special code into compat.lua, altered to use this feature. --- api.lua | 157 ++++++---------------------------------------- compat.lua | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ depends.txt | 2 + init.lua | 1 + 4 files changed, 198 insertions(+), 138 deletions(-) create mode 100644 compat.lua diff --git a/api.lua b/api.lua index 7414cec..0119f75 100644 --- a/api.lua +++ b/api.lua @@ -6,7 +6,6 @@ signs_lib.lbm_restore_nodes = {} signs_lib.old_fenceposts = {} signs_lib.old_fenceposts_replacement_signs = {} signs_lib.old_fenceposts_with_signs = {} -signs_lib.allowed_poles = {} -- Settings used for a standard wood or steel wall sign signs_lib.standard_lines = 6 @@ -152,78 +151,6 @@ signs_lib.flip_walldir = { [5] = 4 } -local htj_north = { - [1] = true, - [3] = true, - [9] = true, - [11] = true, - [21] = true, - [23] = true -} - -local htj_east = { - [0] = true, - [2] = true, - [16] = true, - [18] = true, - [20] = true, - [22] = true -} - -local htj_south = { - [1] = true, - [3] = true, - [5] = true, - [7] = true, - [21] = true, - [23] = true -} - -local htj_west = { - [0] = true, - [2] = true, - [12] = true, - [14] = true, - [20] = true, - [22] = true -} - -local vtj_north = { - [8] = true, - [10] = true, - [13] = true, - [15] = true, - [17] = true, - [19] = true -} - -local vtj_east = { - [4] = true, - [6] = true, - [8] = true, - [10] = true, - [17] = true, - [19] = true -} - -local vtj_south = { - [4] = true, - [6] = true, - [13] = true, - [15] = true, - [17] = true, - [10] = true -} - -local vtj_west = { - [4] = true, - [6] = true, - [8] = true, - [10] = true, - [13] = true, - [15] = true -} - -- Initialize character texture cache local ctexcache = {} @@ -817,83 +744,37 @@ function signs_lib.make_selection_boxes(sizex, sizey, foo, xoffs, yoffs, zoffs, end function signs_lib.check_for_pole(pos, pointed_thing) - local node = minetest.get_node(pos) - local def = minetest.registered_items[node.name] - local ppos = minetest.get_pointed_thing_position(pointed_thing) local pnode = minetest.get_node(ppos) local pdef = minetest.registered_items[pnode.name] - if (signs_lib.allowed_poles[pnode.name] - or (pdef and pdef.drawtype == "fencelike") - or string.find(pnode.name, "default:fence_") + if not pdef then return end + + if type(pdef.check_for_pole) == "function" then + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + return pdef.check_for_pole(pos, node, def, ppos, pnode, pdef) + elseif pdef.check_for_pole + or pdef.drawtype == "fencelike" or string.find(pnode.name, "_post") - or string.find(pnode.name, "fencepost") - or string.find(pnode.name, "streets:streetlamp_basic_top") - or (pnode.name == "streets:bigpole" and pnode.param2 < 4) - or (pnode.name == "streets:bigpole" and pnode.param2 > 19 and pnode.param2 < 24) ) - and (pos.x ~= ppos.x or pos.z ~= ppos.z) then + or string.find(pnode.name, "fencepost") then return true - elseif pnode.name == "streets:bigpole_tjunction" then - if def.paramtype2 == "wallmounted" then - if (node.param2 == 4 and vtj_north[pnode.param2]) - or (node.param2 == 2 and vtj_east[pnode.param2]) - or (node.param2 == 5 and vtj_south[pnode.param2]) - or (node.param2 == 3 and vtj_west[pnode.param2]) then - return true - end - else - if (node.param2 == 0 and vtj_north[pnode.param2]) - or (node.param2 == 1 and vtj_east[pnode.param2]) - or (node.param2 == 2 and vtj_south[pnode.param2]) - or (node.param2 == 3 and vtj_west[pnode.param2]) then - return true - end - end end end function signs_lib.check_for_horizontal_pole(pos, pointed_thing) - local node = minetest.get_node(pos) - local def = minetest.registered_items[node.name] local ppos = minetest.get_pointed_thing_position(pointed_thing) local pnode = minetest.get_node(ppos) - if pnode.name == "streets:bigpole" and pnode.param2 > 3 and pnode.param2 < 12 then - if def.paramtype2 == "wallmounted" then - if node.param2 == 2 or node.param2 == 3 -- E/W - then return true - end - else - if node.param2 == 1 or node.param2 == 3 -- E/W - then return true - end - end - elseif pnode.name == "streets:bigpole" and pnode.param2 > 11 and pnode.param2 < 20 then - if def.paramtype2 == "wallmounted" then - if node.param2 == 4 or node.param2 == 5 then - return true - end - else - if node.param2 == 0 or node.param2 == 2 then - return true - end - end - elseif pnode.name == "streets:bigpole_tjunction" then - if def.paramtype2 == "wallmounted" then - if (node.param2 == 4 and htj_north[pnode.param2]) - or (node.param2 == 2 and htj_east[pnode.param2]) - or (node.param2 == 5 and htj_south[pnode.param2]) - or (node.param2 == 3 and htj_west[pnode.param2]) then - return true - end - else - if (node.param2 == 0 and htj_north[pnode.param2]) - or (node.param2 == 1 and htj_east[pnode.param2]) - or (node.param2 == 2 and htj_south[pnode.param2]) - or (node.param2 == 3 and htj_west[pnode.param2]) then - return true - end - end + local pdef = minetest.registered_items[pnode.name] + + if not pdef then return end + + if type(pdef.check_for_horiz_pole) == "function" then + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + return pdef.check_for_horiz_pole(pos, node, def, ppos, pnode, pdef) + elseif pdef.check_for_horiz_pole then + return true end end diff --git a/compat.lua b/compat.lua new file mode 100644 index 0000000..76405d3 --- /dev/null +++ b/compat.lua @@ -0,0 +1,176 @@ + +local default_fences = { + "default:fence_wood", + "default:fence_acacia_wood", + "default:fence_aspen_wood", + "default:fence_junglewood", + "default:fence_pine_wood" +} + +for _, n in ipairs(default_fences) do + minetest.override_item(n, { + check_for_pole = true + }) +end + +if minetest.get_modpath("streetspoles") then + + local htj_north = { + [1] = true, + [3] = true, + [9] = true, + [11] = true, + [21] = true, + [23] = true + } + + local htj_east = { + [0] = true, + [2] = true, + [16] = true, + [18] = true, + [20] = true, + [22] = true + } + + local htj_south = { + [1] = true, + [3] = true, + [5] = true, + [7] = true, + [21] = true, + [23] = true + } + + local htj_west = { + [0] = true, + [2] = true, + [12] = true, + [14] = true, + [20] = true, + [22] = true + } + + local vtj_north = { + [8] = true, + [10] = true, + [13] = true, + [15] = true, + [17] = true, + [19] = true + } + + local vtj_east = { + [4] = true, + [6] = true, + [8] = true, + [10] = true, + [17] = true, + [19] = true + } + + local vtj_south = { + [4] = true, + [6] = true, + [13] = true, + [15] = true, + [17] = true, + [10] = true + } + + local vtj_west = { + [4] = true, + [6] = true, + [8] = true, + [10] = true, + [13] = true, + [15] = true + } + + minetest.override_item("streets:bigpole", { + check_for_pole = function(pos, node, def, ppos, pnode, pdef) + if pnode.param2 < 4 + or (pnode.param2 > 19 and pnode.param2 < 24) + and (pos.x ~= ppos.x or pos.z ~= ppos.z) then + return true + end + end, + + check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef) + if pnode.param2 > 3 and pnode.param2 < 12 then + if def.paramtype2 == "wallmounted" then + if node.param2 == 2 or node.param2 == 3 -- E/W + then return true + end + else + if node.param2 == 1 or node.param2 == 3 -- E/W + then return true + end + end + elseif pnode.param2 > 11 and pnode.param2 < 20 then + if def.paramtype2 == "wallmounted" then + if node.param2 == 4 or node.param2 == 5 then + return true + end + else + if node.param2 == 0 or node.param2 == 2 then + return true + end + end + end + end + }) + + minetest.override_item("streets:bigpole_tjunction", { + check_for_pole = function(pos, node, def, ppos, pnode, pdef) + if def.paramtype2 == "wallmounted" then + if (node.param2 == 4 and vtj_north[pnode.param2]) + or (node.param2 == 2 and vtj_east[pnode.param2]) + or (node.param2 == 5 and vtj_south[pnode.param2]) + or (node.param2 == 3 and vtj_west[pnode.param2]) then + return true + end + else + if (node.param2 == 0 and vtj_north[pnode.param2]) + or (node.param2 == 1 and vtj_east[pnode.param2]) + or (node.param2 == 2 and vtj_south[pnode.param2]) + or (node.param2 == 3 and vtj_west[pnode.param2]) then + return true + end + end + end, + + check_for_horiz_pole = function(pos, node, def, ppos, pnode, pdef) + if def.paramtype2 == "wallmounted" then + if (node.param2 == 4 and htj_north[pnode.param2]) + or (node.param2 == 2 and htj_east[pnode.param2]) + or (node.param2 == 5 and htj_south[pnode.param2]) + or (node.param2 == 3 and htj_west[pnode.param2]) then + return true + end + else + if (node.param2 == 0 and htj_north[pnode.param2]) + or (node.param2 == 1 and htj_east[pnode.param2]) + or (node.param2 == 2 and htj_south[pnode.param2]) + or (node.param2 == 3 and htj_west[pnode.param2]) then + return true + end + end + end + }) + +end + +if minetest.get_modpath("streetlamps") then + minetest.override_item("streets:streetlamp_basic_top_on", { + selection_box = { + type = "fixed", + fixed = { + {-0.3,-0.4,-0.3,0.3,0.5,0.3}, + {-0.15,-0.4,-0.15,0.15,-1.55,0.15}, + {-0.18,-1.55,-0.18,0.18,-2.5,0.18}, + } + }, + check_for_pole = true + }) +end diff --git a/depends.txt b/depends.txt index c0dd3b0..7e47df4 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,5 @@ default intllib? screwdriver? +streetspoles? +streetlamps? diff --git a/init.lua b/init.lua index 152cf1f..fd6c8e7 100644 --- a/init.lua +++ b/init.lua @@ -13,3 +13,4 @@ signs_lib.gettext = S dofile(signs_lib.path.."/api.lua") dofile(signs_lib.path.."/encoding.lua") dofile(signs_lib.path.."/standard_signs.lua") +dofile(signs_lib.path.."/compat.lua")