From c0e02303670645e8b49160fdc73a1d31760be27f Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Tue, 22 Nov 2016 11:12:11 +0000 Subject: [PATCH] added protector placement tool (thanks shara) --- README.md | 3 ++ init.lua | 1 + tool.lua | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 tool.lua diff --git a/README.md b/README.md index 5fc0bd9..13c93dc 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ Change log: 1.9 - Renamed 'protector_pvp_spawn' setting to 'protector_spawn' which protects an area around static spawnpoint and disables pvp if active. (note: previous name can still be used) +2.0 - Added protector placement tool (thanks to Shara) so that players can easily + stand on a protector, face in a direction and it places a new one at a set + distance to cover protection radius. Lucky Blocks: 6 diff --git a/init.lua b/init.lua index bc8e7ab..54d1e7d 100644 --- a/init.lua +++ b/init.lua @@ -644,6 +644,7 @@ local path = minetest.get_modpath("protector") dofile(path .. "/doors_chest.lua") dofile(path .. "/pvp.lua") dofile(path .. "/admin.lua") +dofile(path .. "/tool.lua") dofile(path .. "/lucky_block.lua") print (S("[MOD] Protector Redo loaded")) diff --git a/tool.lua b/tool.lua new file mode 100644 index 0000000..b7a7118 --- /dev/null +++ b/tool.lua @@ -0,0 +1,115 @@ + +-- protector placement tool (thanks to Shara for code and idea) + +minetest.register_craftitem("protector:tool", { + description = "Protector Placer Tool (stand on protector, face direction and use)", + inventory_image = "protector_display.png", + stack_max = 1, + + on_use = function(itemstack, user, pointed_thing) + + local name = user:get_player_name() + + -- check node player occupies + local pos = user:getpos() + local nod = minetest.get_node(pos).name + if nod ~= "protector:protect2" then + -- check node under player + pos.y = pos.y - 1 + nod = minetest.get_node(pos).name + if nod ~= "protector:protect" + and nod ~= "protector:protect2" then + return + end + end + + -- get direction player is facing + local dir = minetest.dir_to_facedir( user:get_look_dir() ) + local vec = {x = 0, y = 0, z = 0} + local gap = (protector.radius * 2) + 1 + + -- set placement coords + if dir == 0 then + vec.z = gap -- north + elseif dir == 1 then + vec.x = gap -- east + elseif dir == 2 then + vec.z = -gap -- south + elseif dir == 3 then + vec.x = -gap -- west + end + + -- new position + pos.x = pos.x + vec.x + pos.y = pos.y + vec.y + pos.z = pos.z + vec.z + + -- does placing a protector overlap existing area + if not protector.can_dig(protector.radius * 2, pos, + user:get_player_name(), true, 3) then + + minetest.chat_send_player(name, + "Overlaps into above players protected area") + + return + end + + -- does a protector already exist ? + if #minetest.find_nodes_in_area( + vector.subtract(pos, 1), vector.add(pos, 1), + {"protector:protect", "protector:protect2"}) > 0 then + + minetest.chat_send_player(name, "Protector already in place!") + return + end + + -- do we have protectors to use ? + local inv = user:get_inventory() + + if not inv:contains_item("main", "protector:protect") + and not inv:contains_item("main", "protector:protect2") then + minetest.chat_send_player(name, "No protectors available to place!") + return + end + + -- take protector + if inv:contains_item("main", "protector:protect") then + inv:remove_item("main", "protector:protect") + elseif inv:contains_item("main", "protector:protect2") then + inv:remove_item("main", "protector:protect2") + end + + -- place protector + minetest.set_node(pos, {name = nod, param2 = 1}) + + -- set protector metadata + local meta = minetest.get_meta(pos) + meta:set_string("owner", name) + meta:set_string("infotext", "Protection (owned by " .. name .. ")") + meta:set_string("members", "") + + end, +}) + +-- tool recipe +minetest.register_craft({ + output = "protector:tool", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "protector:protect", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +-- recipes to switch between protectors +minetest.register_craft({ + type = "shapeless", + output = "protector:protect", + recipe = {"protector:protect2"} +}) + +minetest.register_craft({ + type = "shapeless", + output = "protector:protect2", + recipe = {"protector:protect"} +})