From bddb2c0c638c9580195f2d5a2a81795dd90c9c84 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 23 Dec 2018 12:00:56 +0100 Subject: [PATCH] visible area cube added --- tubelib/forceload.lua | 11 +++- tubelib/init.lua | 1 + tubelib/mark.lua | 93 ++++++++++++++++++++++++++++++ tubelib/textures/tubelib_cube.png | Bin 0 -> 305 bytes 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tubelib/mark.lua create mode 100644 tubelib/textures/tubelib_cube.png diff --git a/tubelib/forceload.lua b/tubelib/forceload.lua index 516bdfa..ac48a16 100644 --- a/tubelib/forceload.lua +++ b/tubelib/forceload.lua @@ -102,8 +102,11 @@ minetest.register_node("tubelib:forceload", { if add_pos(pos, placer) then minetest.forceload_block(pos, true) local pos1, pos2, num, max = get_data(pos, placer) - M(pos):set_string("infotext", "Area "..S(pos1).." to "..S(pos2).." loaded!") + M(pos):set_string("infotext", "Area "..S(pos1).." to "..S(pos2).." loaded!\n".. + "Punch the block to make the area visible.") chat(placer, "Area ("..num.."/"..max..") "..S(pos1).." to "..S(pos2).." loaded!") + tubelib.mark_region(placer:get_player_name(), pos1, pos2) + M(pos):set_string("owner", placer:get_player_name()) else chat(placer, "Max. number of Forceload Blocks reached!") minetest.remove_node(pos) @@ -114,6 +117,12 @@ minetest.register_node("tubelib:forceload", { after_dig_node = function(pos, oldnode, oldmetadata, digger) del_pos(pos, digger) minetest.forceload_free_block(pos, true) + tubelib.unmark_region(oldmetadata.fields.owner) + end, + + on_punch = function(pos, node, puncher, pointed_thing) + local pos1, pos2 = calc_area(pos) + tubelib.switch_region(puncher:get_player_name(), pos1, pos2) end, paramtype = "light", diff --git a/tubelib/init.lua b/tubelib/init.lua index 8d358d6..1696158 100644 --- a/tubelib/init.lua +++ b/tubelib/init.lua @@ -103,5 +103,6 @@ dofile(minetest.get_modpath("tubelib") .. "/lamp.lua") dofile(minetest.get_modpath("tubelib") .. "/distributor.lua") dofile(minetest.get_modpath("tubelib") .. "/legacy_nodes.lua") dofile(minetest.get_modpath("tubelib") .. "/repairkit.lua") +dofile(minetest.get_modpath("tubelib") .. "/mark.lua") dofile(minetest.get_modpath("tubelib") .. "/forceload.lua") diff --git a/tubelib/mark.lua b/tubelib/mark.lua new file mode 100644 index 0000000..73328db --- /dev/null +++ b/tubelib/mark.lua @@ -0,0 +1,93 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2019 Joachim Stolberg + Code derived from wordedit (sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote)) + + LGPLv2.1+ + See LICENSE.txt for more information + + mark.lua: + +]]-- + +local marker_region = {} + +function tubelib.unmark_region(name) + if marker_region[name] ~= nil then --marker already exists + --wip: make the area stay loaded somehow + for _, entity in ipairs(marker_region[name]) do + entity:remove() + end + marker_region[name] = nil + end +end + +function tubelib.mark_region(name, pos1, pos2) + + tubelib.unmark_region(name) + + local thickness = 0.2 + local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 + local markers = {} + + --XY plane markers + for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do + local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "tubelib:region_cube") + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizex * 2, y=sizey * 2}, + collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, + }) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + end + + --YZ plane markers + for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do + local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "tubelib:region_cube") + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizez * 2, y=sizey * 2}, + collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, + }) + marker:setyaw(math.pi / 2) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + end + + marker_region[name] = markers +end + +function tubelib.switch_region(name, pos1, pos2) + if marker_region[name] ~= nil then --marker already exists + tubelib.unmark_region(name) + else + tubelib.mark_region(name, pos1, pos2) + end +end + +minetest.register_entity(":tubelib:region_cube", { + initial_properties = { + visual = "upright_sprite", + visual_size = {x=1.1, y=1.1}, + textures = {"tubelib_cube.png"}, + use_texture_alpha = true, + visual_size = {x=10, y=10}, + physical = false, + }, + on_step = function(self, dtime) + if marker_region[self.player_name] == nil then + self.object:remove() + return + end + end, + on_punch = function(self, hitter) + tubelib.unmark_region(self.player_name) + end, +}) + diff --git a/tubelib/textures/tubelib_cube.png b/tubelib/textures/tubelib_cube.png new file mode 100644 index 0000000000000000000000000000000000000000..767e9d46f36422d0ef9051c5763e1bb565834b6a GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DjSK$uZf!>a)($X?><>&pI!N1V%8YW9!rNkE}}o-U3d7N_T4w&gplz{C1r`WENs za?PA8?^!Rs{_=$6p075c{Ra*l5nSXUS=FjHA)x7Gzc^dcJ$3iIb>GD&hiy3b_{2?{ zdHLJUF*h9Cm&A~fY@B)2dNyxn>$ELQ3=z+LYqo|do@klpDUj`ZNKwPij62D5l8NQd zGQ|lh^(R9e^)yxU1${WPzb{fq>~0oiwcKrVW6=VO4U