From ea21d1b72fdced2be6d1da31a78d6ab6ed8371a2 Mon Sep 17 00:00:00 2001 From: maikerumine Date: Sat, 11 Nov 2017 12:38:34 -0500 Subject: [PATCH] Update protector and title logo fo 416 --- menu/Thumbs.db | Bin 0 -> 31744 bytes menu/icon.png | Bin 6542 -> 6919 bytes mods/bedrock2/COPYING | 14 + mods/bedrock2/README.txt | 10 + mods/bedrock2/depends.txt | 1 + mods/bedrock2/description.txt | 1 + mods/bedrock2/init.lua | 47 ++ mods/bedrock2/sounds/sounds.zip | Bin 0 -> 19878 bytes mods/bedrock2/textures/bedrock2_bedrock.png | Bin 0 -> 327 bytes .../textures/es_circle_stone_bricks.png} | Bin mods/protector/README.md | 111 ++++- mods/protector/admin.lua | 111 ++++- mods/protector/depends.txt | 5 +- mods/protector/description.txt | 1 + mods/protector/doors_chest.lua | 185 ++++---- mods/protector/hud.lua | 60 +++ mods/protector/init.lua | 405 +++++++++++------- mods/protector/license.txt | 47 +- mods/protector/locale/de.txt | 44 ++ mods/protector/locale/template.txt | 42 ++ mods/protector/locale/tr.txt | 42 ++ mods/protector/lucky_block.lua | 18 + mods/protector/mod.conf | 1 + mods/protector/pvp.lua | 47 +- mods/protector/screenshot.png | Bin 0 -> 12165 bytes .../textures/default_chest_front.png | Bin 0 -> 421 bytes .../protector/textures/default_chest_side.png | Bin 0 -> 375 bytes mods/protector/textures/default_chest_top.png | Bin 0 -> 418 bytes .../moreblocks_circle_stone_bricks.png | Bin 672 -> 0 bytes .../textures/johnsmith/protector_logo.png | Bin 862 -> 0 bytes mods/protector/textures/license.txt | 15 + .../moreblocks_circle_stone_bricks - Copy.png | Bin 1649 -> 0 bytes mods/protector/tool.lua | 124 ++++++ 33 files changed, 1028 insertions(+), 303 deletions(-) create mode 100644 menu/Thumbs.db create mode 100644 mods/bedrock2/COPYING create mode 100644 mods/bedrock2/README.txt create mode 100644 mods/bedrock2/depends.txt create mode 100644 mods/bedrock2/description.txt create mode 100644 mods/bedrock2/init.lua create mode 100644 mods/bedrock2/sounds/sounds.zip create mode 100644 mods/bedrock2/textures/bedrock2_bedrock.png rename mods/{protector/textures/moreblocks_circle_stone_bricks.png => es/textures/es_circle_stone_bricks.png} (100%) create mode 100644 mods/protector/description.txt create mode 100644 mods/protector/hud.lua create mode 100644 mods/protector/locale/de.txt create mode 100644 mods/protector/locale/template.txt create mode 100644 mods/protector/locale/tr.txt create mode 100644 mods/protector/lucky_block.lua create mode 100644 mods/protector/mod.conf create mode 100644 mods/protector/screenshot.png create mode 100644 mods/protector/textures/default_chest_front.png create mode 100644 mods/protector/textures/default_chest_side.png create mode 100644 mods/protector/textures/default_chest_top.png delete mode 100644 mods/protector/textures/johnsmith/moreblocks_circle_stone_bricks.png delete mode 100644 mods/protector/textures/johnsmith/protector_logo.png create mode 100644 mods/protector/textures/license.txt delete mode 100644 mods/protector/textures/moreblocks_circle_stone_bricks - Copy.png create mode 100644 mods/protector/tool.lua diff --git a/menu/Thumbs.db b/menu/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..4f1599d8af9a20df57c63d8c69d7deb0c3fe310f GIT binary patch literal 31744 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 WU!Z;vC+=|j<>CLS?EN=uo&N!H&@p}h literal 0 HcmV?d00001 diff --git a/menu/icon.png b/menu/icon.png index 0ef61087bd2e818db94e1c1f84a0fc09a93aca27..21d290784cc0bab0dc62071904239fef5c8c4840 100644 GIT binary patch literal 6919 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 N002ovPDHLkV1jVzt8xGU literal 6542 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 AbN~PV diff --git a/mods/bedrock2/COPYING b/mods/bedrock2/COPYING new file mode 100644 index 00000000..5a8e3325 --- /dev/null +++ b/mods/bedrock2/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/mods/bedrock2/README.txt b/mods/bedrock2/README.txt new file mode 100644 index 00000000..78ad2dae --- /dev/null +++ b/mods/bedrock2/README.txt @@ -0,0 +1,10 @@ +Bedrock mod. + +Version 1.0.0 + +This mod adds an indestructible bedrock layer at the bottom of the world. + + +This mod recognizes the following minetest.conf setting: + +* `bedrock2_y`: Sets the Y coordinate on which the bedrock layer will be created (default: -30912). diff --git a/mods/bedrock2/depends.txt b/mods/bedrock2/depends.txt new file mode 100644 index 00000000..59619ab3 --- /dev/null +++ b/mods/bedrock2/depends.txt @@ -0,0 +1 @@ +mesecons_mvps? diff --git a/mods/bedrock2/description.txt b/mods/bedrock2/description.txt new file mode 100644 index 00000000..0de789f6 --- /dev/null +++ b/mods/bedrock2/description.txt @@ -0,0 +1 @@ +Adds an indestructable bedrock layer at the bottom of the world. diff --git a/mods/bedrock2/init.lua b/mods/bedrock2/init.lua new file mode 100644 index 00000000..aeb66c6b --- /dev/null +++ b/mods/bedrock2/init.lua @@ -0,0 +1,47 @@ +local bedrock = {} + +bedrock.layer = -6001 -- determined as appropriate by experiment +bedrock.node = {name = "bedrock2:bedrock"} + +local depth = tonumber(minetest.setting_get("bedrock2_y")) +if depth ~= nil then + bedrock.layer = depth +end + +minetest.register_on_generated(function(minp, maxp) + if maxp.y >= bedrock.layer and minp.y <= bedrock.layer then + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local data = vm:get_data() + local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + local c_bedrock = minetest.get_content_id("bedrock2:bedrock") + + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local p_pos = area:index(x, bedrock.layer, z) + data[p_pos] = c_bedrock + end + end + + vm:set_data(data) + vm:calc_lighting() + vm:update_liquids() + vm:write_to_map() + end +end) + +minetest.register_node("bedrock2:bedrock", { + description = "Bedrock", + tiles = {"bedrock2_bedrock.png"}, + groups = {immortal=1, not_in_creative_inventory=1}, + sounds = { footstep = { name = "bedrock2_step", gain = 1 } }, + is_ground_content = false, + on_blast = function() end, + on_destruct = function () end, + can_dig = function() return false end, + diggable = false, + drop = "", +}) + +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_mvps_stopper("bedrock2:bedrock") +end diff --git a/mods/bedrock2/sounds/sounds.zip b/mods/bedrock2/sounds/sounds.zip new file mode 100644 index 0000000000000000000000000000000000000000..e9f64d29d058d9b85f3c82eb8c82e4d64257f713 GIT binary patch literal 19878 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 Mfsug$Zv5x%Uu2OK7XSbN literal 0 HcmV?d00001 diff --git a/mods/bedrock2/textures/bedrock2_bedrock.png b/mods/bedrock2/textures/bedrock2_bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..2d29423f545d8299971022dc942b1b0accc005da GIT binary patch literal 327 zcmV-N0l5B&P)QHH^)t#;^z&Hp5 zYsZx5bZ)T}_Dc{7FdOjl{EWul(U;_q;>tyKN!e5Nwbqk+HGCCOJ{J15X?mN&S}eiF zfzZ6you~@>hWo?BXnabE_Ra{)1mie0hWx7DU7ML-N_c7}(FuvvyNo#aE}(pZydOl! zagq~_%1UH0Y3o_i0(HyIn~R%%upil@;;ab9u*_MJe@PS^S~33wZh}0{&quQValNK< Z=^yDbao4{9inag%002ovPDHLkV1j_2n+^Z~ literal 0 HcmV?d00001 diff --git a/mods/protector/textures/moreblocks_circle_stone_bricks.png b/mods/es/textures/es_circle_stone_bricks.png similarity index 100% rename from mods/protector/textures/moreblocks_circle_stone_bricks.png rename to mods/es/textures/es_circle_stone_bricks.png diff --git a/mods/protector/README.md b/mods/protector/README.md index 2e53f922..0ef4983d 100644 --- a/mods/protector/README.md +++ b/mods/protector/README.md @@ -3,53 +3,118 @@ Protector Redo mod [protect] Protector redo for minetest is a mod that protects a players builds by placing a block that stops other players from digging or placing blocks in that area. -based on glomie's mod, remade by Zeg9 and reworked by TenPlus1. +based on glomie's mod, remade by Zeg9 and rewritten by TenPlus1. https://forum.minetest.net/viewtopic.php?f=11&t=9376 -Released under WTFPL +Change log: -0.1 - Initial release -0.2 - Texture update -0.3 - Added Protection Logo to blend in with player builds -0.4 - Code tweak for 0.4.10+ -0.5 - Added protector.radius variable in init.lua (default: 5) -0.6 - Added Protected Doors (wood and steel) and Protected Chest -0.7 - Protected Chests now have "To Chest" and "To Inventory" buttons to copy +- 0.1 - Initial release +- 0.2 - Texture update +- 0.3 - Added Protection Logo to blend in with player builds +- 0.4 - Code tweak for 0.4.10+ +- 0.5 - Added protector.radius variable in init.lua (default: 5) +- 0.6 - Added Protected Doors (wood and steel) and Protected Chest +- 0.7 - Protected Chests now have "To Chest" and "To Inventory" buttons to copy contents across, also chests can be named -0.8 - Updated to work with Minetest 0.4.12, simplified textures -0.9 - Tweaked code -1.0 - Only owner can remove protector -1.1 - Set 'protector_pvp = true' in minetest.conf to disable pvp in protected +- 0.8 - Updated to work with Minetest 0.4.12, simplified textures +- 0.9 - Tweaked code +- 1.0 - Only owner can remove protector +- 1.1 - Set 'protector_pvp = true' in minetest.conf to disable pvp in protected areas except your own, also setting protector_pvp_spawn higher than 0 will disable pvp around spawn area with the radius you entered -1.2 - Shift and click support added with Minetest 0.4.13 to quickly copy stacks +- 1.2 - Shift and click support added with Minetest 0.4.13 to quickly copy stacks to and from protected chest -1.3 - Moved protector on_place into node itself, protector zone display changed +- 1.3 - Moved protector on_place into node itself, protector zone display changed from 10 to 5 seconds, general code tidy -1.4 - Changed protector recipes to give single item instead of 4, added + button +- 1.4 - Changed protector recipes to give single item instead of 4, added + button to interface, tweaked and tidied code, added admin command /delprot to remove protectors in bulk from banned/old players -1.5 - Added much requested protected trapdoor -1.6 - Added protector_drop (true or false) and protector_hurt (hurt by this num) +- 1.5 - Added much requested protected trapdoor +- 1.6 - Added protector_drop (true or false) and protector_hurt (hurt by this num) variables to minetest.conf settings to stop players breaking protected areas by dropping tools and hurting player. -1.7 - Included an edited version of WTFPL doors mod since protected doors didn't +- 1.7 - Included an edited version of WTFPL doors mod since protected doors didn't work with the doors mod in the latest daily build... Now it's fine :) + added support for "protection_bypass" privelage. +- 1.8 - Added 'protector_flip' setting to stop players using lag to grief into + another players house, it flips them around to stop them digging. +- 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. Added /protector_show command (thanks agaran) + Protectors and chest cannot be moved by mesecon pistons or machines. +- 2.1 - Added 'protector_night_pvp' setting so night-time becomes a free for all and + players can hurt one another even inside protected areas (not spawn protected) +- 2.2 - Updated protector tool so that player only needs to stand nearby (2 block radius) + It can also place vertically (up and down) as well. New protector recipe added. +- 2.3 - Localise many of the protector functions and tidy code. +- 2.4 - Update to newer functions, Minetest 0.4.16 needed to run now. +- 2.5 - Added HUD text to show when player is inside a protected area (updates every 5 seconds) + +Lucky Blocks: 10 + Usage: (requires server privelage) list names to remove - /delprot + /protector_remove remove specific user names - /delprot name1 name2 + /protector_remove name1 name2 remove all names from list - /delprot - + /protector_remove - Whenever a player is near any protectors with name1 or name2 then it will be -replaced by an air block. \ No newline at end of file +replaced by an air block. + + +show owner name to replace + + /protector_replace + +replace owner with new name + + /protector_replace owner new_owner + +reset name list + + /protector_replace - + + +show protected areas of your nearby protectors (max of 5) + /protector_show + + +The following lines can be added to your minetest.conf file to configure specific features of the mod: + +protector_radius = 5 +- Sets the area around each protection node so that other players cannot dig, place or enter through protected doors or chests. + +protector_pvp = true +- true or false this setting disabled pvp inside of protected areas for all players apart from those listed on the protector node. + +protector_night_pvp = false +- when true this setting enables pvp at night time only, even inside protected areas, requires protector_pvp to be active to work. + +protector_spawn = 10 +- Sets an area 10 nodes around static spawnpoint that is protected. + +protector_hurt = 2 +- When set to above 0, players digging in protected areas will be hurt by 2 health points (or whichever number it's set to) + +protector_flip = true +- When true players who dig inside a protected area will flipped around to stop them using lag to grief into someone else's build + + +Protector Tool + +Can be crafted with a protector surrounded by steel ingots and is used to place new protectors at a set distance of protector.radius in all directions including up and down simply by looking in a direction. + +Use by standing near an existing protector, looking in a direction and using as a tool, hold sneak/shift to place new protector containing member list from inside nearest one. diff --git a/mods/protector/admin.lua b/mods/protector/admin.lua index e48c0e45..e73412cf 100644 --- a/mods/protector/admin.lua +++ b/mods/protector/admin.lua @@ -1,9 +1,12 @@ +local S = protector.intllib + protector.removal_names = "" +protector.replace_names = "" -minetest.register_chatcommand("delprot", { - params = "", - description = "Remove Protectors near players with names provided (separate names with spaces)", +minetest.register_chatcommand("protector_remove", { + params = "", + description = S("Remove Protectors around players (separate names with spaces)"), privs = {server = true}, func = function(name, param) @@ -17,8 +20,9 @@ minetest.register_chatcommand("delprot", { end if param == "-" then + minetest.chat_send_player(name, - "Name List Reset") + S("Name List Reset")) protector.removal_names = "" @@ -30,6 +34,42 @@ minetest.register_chatcommand("delprot", { end, }) + +minetest.register_chatcommand("protector_replace", { + params = " ", + description = S("Replace Protector Owner with name provided"), + privs = {server = true}, + func = function(name, param) + + -- reset list to empty + if param == "-" then + + minetest.chat_send_player(name, S("Name List Reset")) + + protector.replace_names = "" + + return + end + + -- show name info + if param == "" + and protector.replace_names ~= "" then + + local names = protector.replace_names:split(" ") + + minetest.chat_send_player(name, + "Replacing Protector name '" .. (names[1] or "") + .. "' with '" .. (names[2] or "").. "'") + + return + end + + protector.replace_names = param + + end, +}) + + minetest.register_abm({ nodenames = {"protector:protect", "protector:protect2"}, interval = 8, @@ -37,23 +77,70 @@ minetest.register_abm({ catch_up = false, action = function(pos, node) - if protector.removal_names == "" then + if protector.removal_names == "" + and protector.replace_names == "" then return end - local meta = minetest.get_meta(pos) + local meta = minetest.get_meta(pos) ; if not meta then return end local owner = meta:get_string("owner") --local members = meta:get_string("members") - local names = protector.removal_names:split(" ") + if protector.removal_names ~= "" then - for _, n in pairs(names) do + local names = protector.removal_names:split(" ") - if n == owner then - minetest.set_node(pos, {name = "air"}) + for _, n in pairs(names) do + + if n == owner then + minetest.set_node(pos, {name = "air"}) + end + end + end + + if protector.replace_names ~= "" then + + local names = protector.replace_names:split(" ") + + if names[1] and names[2] and owner == names[1] then + + meta:set_string("owner", names[2]) + meta:set_string("infotext", "Protection (owned by " .. names[2] .. ")") end end - end -}) \ No newline at end of file +}) + + +-- show protection areas of nearby protectors owned by you (thanks agaran) +minetest.register_chatcommand("protector_show", { + params = "", + description = "Show protected areas of your nearby protectors", + privs = {}, + func = function(name, param) + + local player = minetest.get_player_by_name(name) + local pos = player:get_pos() + local r = protector.radius -- max protector range. + + -- find the protector nodes + local pos = minetest.find_nodes_in_area( + {x = pos.x - r, y = pos.y - r, z = pos.z - r}, + {x = pos.x + r, y = pos.y + r, z = pos.z + r}, + {"protector:protect", "protector:protect2"}) + + local meta, owner + + -- show a maximum of 5 protected areas only + for n = 1, math.min(#pos, 5) do + + meta = minetest.get_meta(pos[n]) + owner = meta:get_string("owner") or "" + + if owner == name then + minetest.add_entity(pos[n], "protector:display") + end + end + end +}) diff --git a/mods/protector/depends.txt b/mods/protector/depends.txt index 0b6a14a7..4713addd 100644 --- a/mods/protector/depends.txt +++ b/mods/protector/depends.txt @@ -1,3 +1,4 @@ default -doors? -mobs? \ No newline at end of file +intllib? +lucky_block? +mesecons_mvps? diff --git a/mods/protector/description.txt b/mods/protector/description.txt new file mode 100644 index 00000000..587fee89 --- /dev/null +++ b/mods/protector/description.txt @@ -0,0 +1 @@ +Lets players craft special blocks to protect their builds or disable PVP in areas. \ No newline at end of file diff --git a/mods/protector/doors_chest.lua b/mods/protector/doors_chest.lua index bdb9fee8..054797d6 100644 --- a/mods/protector/doors_chest.lua +++ b/mods/protector/doors_chest.lua @@ -1,7 +1,9 @@ -- Since the doors mod has changed in the latest daily builds I have taken the -- WTFPL licenced code from the old doors mod and included an edited version --- of it within this mod for local use. +-- within this mod for local use. + +local S = protector.intllib -- Registers a door function register_door(name, def) @@ -295,7 +297,7 @@ end local name = "protector:door_wood" register_door(name, { - description = "Protected Wooden Door", + description = S("Protected Wooden Door"), inventory_image = "doors_wood.png^protector_logo.png", groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, @@ -328,7 +330,7 @@ minetest.register_craft({ local name = "protector:door_steel" register_door(name, { - description = "Protected Steel Door", + description = S("Protected Steel Door"), inventory_image = "doors_steel.png^protector_logo.png", groups = { snappy = 1, bendy = 2, cracky = 1, @@ -419,7 +421,7 @@ end -- Protected Wooden Trapdoor register_trapdoor("protector:trapdoor", { - description = "Protected Trapdoor", + description = S("Protected Trapdoor"), inventory_image = "doors_trapdoor.png^protector_logo.png", wield_image = "doors_trapdoor.png^protector_logo.png", tile_front = "doors_trapdoor.png^protector_logo.png", @@ -450,7 +452,7 @@ minetest.register_craft({ -- Protected Steel Trapdoor register_trapdoor("protector:trapdoor_steel", { - description = "Protected Steel Trapdoor", + description = S("Protected Steel Trapdoor"), inventory_image = "doors_trapdoor_steel.png^protector_logo.png", wield_image = "doors_trapdoor_steel.png^protector_logo.png", tile_front = "doors_trapdoor_steel.png^protector_logo.png", @@ -480,7 +482,7 @@ minetest.register_craft({ -- Protected Chest minetest.register_node("protector:chest", { - description = "Protected Chest", + description = S("Protected Chest"), tiles = { "default_chest_top.png", "default_chest_top.png", "default_chest_side.png", "default_chest_side.png", @@ -497,7 +499,7 @@ minetest.register_node("protector:chest", { local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - meta:set_string("infotext", "Protected Chest") + meta:set_string("infotext", S("Protected Chest")) meta:set_string("name", "") inv:set_size("main", 8 * 4) end, @@ -517,16 +519,47 @@ minetest.register_node("protector:chest", { on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() - .. " moves stuff to protected chest at " - .. minetest.pos_to_string(pos)) + minetest.log("action", S("@1 moves stuff to protected chest at @2", + player:get_player_name(), minetest.pos_to_string(pos))) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() - .. " takes stuff from protected chest at " - .. minetest.pos_to_string(pos)) + minetest.log("action", S("@1 takes stuff from protected chest at @2", + player:get_player_name(), minetest.pos_to_string(pos))) + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + + minetest.log("action", S("@1 moves stuff inside protected chest at @2", + player:get_player_name(), minetest.pos_to_string(pos))) + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return count end, on_rightclick = function(pos, node, clicker) @@ -547,10 +580,10 @@ minetest.register_node("protector:chest", { .. default.gui_bg_img .. default.gui_slots .. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]" - .. "button[0,4.5;2,0.25;toup;To Chest]" + .. "button[0,4.5;2,0.25;toup;" .. S("To Chest") .. "]" .. "field[2.3,4.8;4,0.25;chestname;;" .. meta:get_string("name") .. "]" - .. "button[6,4.5;2,0.25;todn;To Inventory]" + .. "button[6,4.5;2,0.25;todn;" .. S("To Inventory") .. "]" .. "list[current_player;main;0,5;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" @@ -569,67 +602,71 @@ minetest.register_node("protector:chest", { minetest.register_on_player_receive_fields(function(player, formname, fields) - if string.sub(formname, 0, string.len("protector:chest_")) == "protector:chest_" then - - local pos_s = string.sub(formname,string.len("protector:chest_") + 1) - local pos = minetest.string_to_pos(pos_s) - local meta = minetest.get_meta(pos) - local chest_inv = meta:get_inventory() - local player_inv = player:get_inventory() - local leftover - - if fields.toup then - - -- copy contents of players inventory to chest - for i, v in pairs (player_inv:get_list("main") or {}) do - - if chest_inv - and chest_inv:room_for_item('main', v) then - - leftover = chest_inv:add_item('main', v) - - player_inv:remove_item("main", v) - - if leftover - and not leftover:is_empty() then - player_inv:add_item("main", v) - end - end - end - - elseif fields.todn then - - -- copy contents of chest to players inventory - for i, v in pairs (chest_inv:get_list('main') or {}) do - - if player_inv:room_for_item("main", v) then - - leftover = player_inv:add_item("main", v) - - chest_inv:remove_item('main', v) - - if leftover - and not leftover:is_empty() then - chest_inv:add_item('main', v) - end - end - end - - elseif fields.chestname then - - -- change chest infotext to display name - if fields.chestname ~= "" then - - meta:set_string("name", fields.chestname) - meta:set_string("infotext", - "Protected Chest (" .. fields.chestname .. ")") - else - meta:set_string("infotext", "Protected Chest") - end - - end + if string.sub(formname, 0, string.len("protector:chest_")) ~= "protector:chest_" then + return end + local pos_s = string.sub(formname,string.len("protector:chest_") + 1) + local pos = minetest.string_to_pos(pos_s) + + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local meta = minetest.get_meta(pos) ; if not meta then return end + local chest_inv = meta:get_inventory() ; if not chest_inv then return end + local player_inv = player:get_inventory() + local leftover + + if fields.toup then + + -- copy contents of players inventory to chest + for i, v in ipairs(player_inv:get_list("main") or {}) do + + if chest_inv:room_for_item("main", v) then + + leftover = chest_inv:add_item("main", v) + + player_inv:remove_item("main", v) + + if leftover + and not leftover:is_empty() then + player_inv:add_item("main", v) + end + end + end + + elseif fields.todn then + + -- copy contents of chest to players inventory + for i, v in ipairs(chest_inv:get_list("main") or {}) do + + if player_inv:room_for_item("main", v) then + + leftover = player_inv:add_item("main", v) + + chest_inv:remove_item("main", v) + + if leftover + and not leftover:is_empty() then + chest_inv:add_item("main", v) + end + end + end + + elseif fields.chestname then + + -- change chest infotext to display name + if fields.chestname ~= "" then + + meta:set_string("name", fields.chestname) + meta:set_string("infotext", + S("Protected Chest (@1)", fields.chestname)) + else + meta:set_string("infotext", S("Protected Chest")) + end + + end end) -- Protected Chest recipes diff --git a/mods/protector/hud.lua b/mods/protector/hud.lua new file mode 100644 index 00000000..cbf1bd2c --- /dev/null +++ b/mods/protector/hud.lua @@ -0,0 +1,60 @@ + +local radius = (tonumber(minetest.setting_get("protector_radius")) or 5) +local hud = {} +local hud_timer = 0 + +minetest.register_globalstep(function(dtime) + + hud_timer = hud_timer + dtime + if hud_timer < 5 then + return + end + hud_timer = 0 + + for _, player in pairs(minetest.get_connected_players()) do + + local name = player:get_player_name() + local pos = vector.round(player:getpos()) + local hud_text = "You can build here" + + local protectors = minetest.find_nodes_in_area( + {x=pos.x -radius , y=pos.y -radius , z=pos.z -radius}, + {x=pos.x +radius , y=pos.y +radius , z=pos.z +radius}, + {"protector:protect","protector:protect2"}) + + if #protectors > 0 then + local npos = protectors[1] + local meta = minetest.get_meta(npos) + local nodeowner = meta:get_string("owner") + + hud_text = "Owned by: " .. nodeowner + end + + if not hud[name] then + + hud[name] = {} + + hud[name].id = player:hud_add({ + hud_elem_type = "text", + name = "Protector Area", + number = 0xFFFF22, + position = {x=0, y=0.95}, + offset = {x=8, y=-8}, + text = hud_text, + scale = {x=200, y=60}, + alignment = {x=1, y=-1}, + }) + + return + + else + + player:hud_change(hud[name].id, "text", hud_text) + end + end +end) + +minetest.register_on_leaveplayer(function(player) + hud[player:get_player_name()] = nil +end) + diff --git a/mods/protector/init.lua b/mods/protector/init.lua index f9136cc7..260aebc3 100644 --- a/mods/protector/init.lua +++ b/mods/protector/init.lua @@ -1,24 +1,59 @@ -minetest.register_privilege("delprotect","Ignore player protection") +-- get minetest.conf settings protector = {} protector.mod = "redo" -protector.radius = (tonumber(minetest.setting_get("protector_radius")) or 3) -protector.drop = minetest.setting_getbool("protector_drop") or false -protector.hurt = (tonumber(minetest.setting_get("protector_hurt")) or 0) +protector.radius = tonumber(minetest.settings:get("protector_radius")) or 3 +protector.flip = minetest.settings:get_bool("protector_flip") or false +protector.hurt = tonumber(minetest.settings:get("protector_hurt")) or 0 +protector.spawn = tonumber(minetest.settings:get("protector_spawn") + or minetest.settings:get("protector_pvp_spawn")) or 0 -protector.get_member_list = function(meta) + +-- get static spawn position +local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) + or {x = 0, y = 2, z = 0} + + +-- Intllib +local S +if minetest.get_modpath("intllib") then + S = intllib.Getter() +else + S = function(s, a, ...) a = {a, ...} + return s:gsub("@(%d+)", function(n) + return a[tonumber(n)] + end) + end + +end +protector.intllib = S + + +-- return list of members as a table +local get_member_list = function(meta) return meta:get_string("members"):split(" ") end -protector.set_member_list = function(meta, list) + +-- write member list table in protector meta as string +local set_member_list = function(meta, list) meta:set_string("members", table.concat(list, " ")) end -protector.is_member = function (meta, name) - for _, n in pairs(protector.get_member_list(meta)) do +-- check for owner name +local is_owner = function(meta, name) + + return name == meta:get_string("owner") +end + + +-- check for member name +local is_member = function (meta, name) + + for _, n in pairs(get_member_list(meta)) do if n == name then return true @@ -28,22 +63,28 @@ protector.is_member = function (meta, name) return false end -protector.add_member = function(meta, name) - if protector.is_member(meta, name) then +-- add player name to table as member +local add_member = function(meta, name) + + -- does name already exist? + if is_owner(meta, name) + or is_member(meta, name) then return end - local list = protector.get_member_list(meta) + local list = get_member_list(meta) table.insert(list, name) - protector.set_member_list(meta, list) + set_member_list(meta, list) end -protector.del_member = function(meta, name) - local list = protector.get_member_list(meta) +-- remove player name from table +local del_member = function(meta, name) + + local list = get_member_list(meta) for i, n in pairs(list) do @@ -53,39 +94,39 @@ protector.del_member = function(meta, name) end end - protector.set_member_list(meta, list) + set_member_list(meta, list) end --- Protector Interface -protector.generate_formspec = function(meta) +-- protector interface +local protector_formspec = function(meta) local formspec = "size[8,7]" .. default.gui_bg .. default.gui_bg_img .. default.gui_slots - .. "label[2.5,0;-- Protector interface --]" - .. "label[0,1;PUNCH node to show protected area or USE for area check]" - .. "label[0,2;Members: (type player name then press Enter to add)]" - .. "button_exit[2.5,6.2;3,0.5;close_me;Close]" + .. "label[2.5,0;" .. S("-- Protector interface --") .. "]" + .. "label[0,1;" .. S("PUNCH node to show protected area") .. "]" + .. "label[0,2;" .. S("Members:") .. "]" + .. "button_exit[2.5,6.2;3,0.5;close_me;" .. S("Close") .. "]" - local members = protector.get_member_list(meta) - local npp = 12 -- max users added onto protector list + local members = get_member_list(meta) + local npp = 12 -- max users added to protector list local i = 0 - for _, member in pairs(members) do + for n = 1, #members do if i < npp then -- show username formspec = formspec .. "button[" .. (i % 4 * 2) .. "," .. math.floor(i / 4 + 3) - .. ";1.5,.5;protector_member;" .. member .. "]" + .. ";1.5,.5;protector_member;" .. members[n] .. "]" -- username remove button .. "button[" .. (i % 4 * 2 + 1.25) .. "," .. math.floor(i / 4 + 3) - .. ";.75,.5;protector_del_member_" .. member .. ";X]" + .. ";.75,.5;protector_del_member_" .. members[n] .. ";X]" end i = i + 1 @@ -107,6 +148,28 @@ protector.generate_formspec = function(meta) return formspec end + +-- check if pos is inside a protected spawn area +local inside_spawn = function(pos, radius) + + if protector.spawn <= 0 then + return false + end + + if pos.x < statspawn.x + radius + and pos.x > statspawn.x - radius + and pos.y < statspawn.y + radius + and pos.y > statspawn.y - radius + and pos.z < statspawn.z + radius + and pos.z > statspawn.z - radius then + + return true + end + + return false +end + + -- Infolevel: -- 0 for no info -- 1 for "This area is owned by !" if you can't dig @@ -115,76 +178,67 @@ end protector.can_dig = function(r, pos, digger, onlyowner, infolevel) - if not digger - or not pos then + if not digger or not pos then return false end - -- Delprotect privileged users can override protections - - if minetest.check_player_privs(digger, {delprotect = true}) - and infolevel == 1 then + -- protector_bypass privileged users can override protection + if infolevel == 1 + and minetest.check_player_privs(digger, {protection_bypass = true}) then return true end + -- infolevel 3 is only used to bypass priv check, change to 1 now if infolevel == 3 then infolevel = 1 end - -- Find the protector nodes + -- is spawn area protected ? + if inside_spawn(pos, protector.spawn) then - local positions = minetest.find_nodes_in_area( + minetest.chat_send_player(digger, + S("Spawn @1 has been protected up to a @2 block radius.", + minetest.pos_to_string(statspawn), protector.spawn)) + + return false + end + + -- find the protector nodes + local pos = minetest.find_nodes_in_area( {x = pos.x - r, y = pos.y - r, z = pos.z - r}, {x = pos.x + r, y = pos.y + r, z = pos.z + r}, {"protector:protect", "protector:protect2"}) local meta, owner, members - for _, pos in pairs(positions) do + for n = 1, #pos do - meta = minetest.get_meta(pos) - owner = meta:get_string("owner") - members = meta:get_string("members") + meta = minetest.get_meta(pos[n]) + owner = meta:get_string("owner") or "" + members = meta:get_string("members") or "" - if owner ~= digger then + -- node change and digger isn't owner + if infolevel == 1 and owner ~= digger then - if onlyowner - or not protector.is_member(meta, digger) then + -- and you aren't on the member list + if onlyowner or not is_member(meta, digger) then - if infolevel == 1 then + minetest.chat_send_player(digger, + S("This area is owned by @1!", owner)) - minetest.chat_send_player(digger, - "This area is owned by " .. owner .. " !") - - elseif infolevel == 2 then - - minetest.chat_send_player(digger, - "This area is owned by " .. owner .. ".") - - minetest.chat_send_player(digger, - "Protection located at: " .. minetest.pos_to_string(pos)) - - if members ~= "" then - - minetest.chat_send_player(digger, - "Members: " .. members .. ".") - end - end - - return false + return false end end + -- when using protector as tool, show protector information if infolevel == 2 then - minetest.chat_send_player(digger, - "This area is owned by " .. owner .. ".") + minetest.chat_send_player(digger, S("This area is owned by @1.", owner)) minetest.chat_send_player(digger, - "Protection located at: " .. minetest.pos_to_string(pos)) + S("Protection located at: @1", minetest.pos_to_string(pos[n]))) if members ~= "" then - minetest.chat_send_player(digger, - "Members: " .. members .. ".") + minetest.chat_send_player(digger, S("Members: @1.", members)) end return false @@ -192,98 +246,121 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel) end + -- show when you can build on unprotected area if infolevel == 2 then - if #positions < 1 then + if #pos < 1 then - minetest.chat_send_player(digger, - "This area is not protected.") + minetest.chat_send_player(digger, S("This area is not protected.")) end - minetest.chat_send_player(digger, "You can build here.") + minetest.chat_send_player(digger, S("You can build here.")) end return true end --- Can node be added or removed, if so return node else true (for protected) -protector.old_is_protected = minetest.is_protected +local old_is_protected = minetest.is_protected +-- check for protected area, return true if protected and digger isn't on list function minetest.is_protected(pos, digger) + digger = digger or "" -- nil check + + -- is area protected against digger? if not protector.can_dig(protector.radius, pos, digger, false, 1) then local player = minetest.get_player_by_name(digger) - -- hurt player if protection violated - if protector.hurt > 0 - and player then - player:set_hp(player:get_hp() - protector.hurt) - end - - -- drop tool/item if protection violated - if protector.drop == true - and player then - - local holding = player:get_wielded_item() - - if holding:to_string() ~= "" then - - -- take stack - local sta = holding:take_item(holding:get_count()) - player:set_wielded_item(holding) - - -- incase of lag, reset stack - minetest.after(0.1, function() - player:set_wielded_item(holding) - - -- drop stack - local obj = minetest.add_item(player:getpos(), sta) - obj:setvelocity({x = 0, y = 5, z = 0}) - end) + if player and player:is_player() then + -- hurt player if protection violated + if protector.hurt > 0 and player:get_hp() > 0 then + player:set_hp(player:get_hp() - protector.hurt) end + -- flip player when protection violated + if protector.flip then + -- yaw + 180° + local yaw = player:get_look_horizontal() + math.pi + --local yaw = player:get_look_yaw() + math.pi + + if yaw > 2 * math.pi then + yaw = yaw - 2 * math.pi + end + + --player:set_look_horizontal(yaw) + player:set_look_yaw(yaw) + + -- invert pitch + player:set_look_vertical(-player:get_look_vertical()) + --player:set_look_pitch(-player:get_look_pitch()) + + -- if digging below player, move up to avoid falling through hole + local pla_pos = player:get_pos() + + if pos.y < pla_pos.y then + + player:setpos({ + x = pla_pos.x, + y = pla_pos.y + 0.8, + z = pla_pos.z + }) + end + end end return true end - return protector.old_is_protected(pos, digger) - + -- otherwise can dig or place + return old_is_protected(pos, digger) end --- Make sure protection block doesn't overlap another protector's area -function protector.check_overlap(itemstack, placer, pointed_thing) +-- make sure protection block doesn't overlap another protector's area +local check_overlap = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return itemstack end - if not protector.can_dig(protector.radius * 2, pointed_thing.above, - placer:get_player_name(), true, 3) then + local pos = pointed_thing.above + local name = placer:get_player_name() - minetest.chat_send_player(placer:get_player_name(), - "Overlaps into above players protected area") + -- make sure protector doesn't overlap onto protected spawn area + if inside_spawn(pos, protector.spawn + protector.radius) then - return + minetest.chat_send_player(name, + S("Spawn @1 has been protected up to a @2 block radius.", + minetest.pos_to_string(statspawn), protector.spawn)) + + return itemstack + end + + -- make sure protector doesn't overlap any other player's area + if not protector.can_dig(protector.radius * 2, pos, name, true, 3) then + + minetest.chat_send_player(name, + S("Overlaps into above players protected area")) + + return itemstack end return minetest.item_place(itemstack, placer, pointed_thing) end ---= Protection Block +-- protection node minetest.register_node("protector:protect", { - description = "Protection Block", + description = S("Protection Block") .. " (" .. S("USE for area check") .. ")", drawtype = "nodebox", tiles = { - "moreblocks_circle_stone_bricks.png", - "moreblocks_circle_stone_bricks.png", - "moreblocks_circle_stone_bricks.png^protector_logo.png" + "es_circle_stone_bricks.png", + "es_circle_stone_bricks.png", + "es_circle_stone_bricks.png^protector_logo.png" }, sounds = default.node_sound_stone_defaults(), groups = {dig_immediate = 2, unbreakable = 1}, @@ -298,14 +375,14 @@ minetest.register_node("protector:protect", { } }, - on_place = protector.check_overlap, + on_place = check_overlap, after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Protection (owned by " .. meta:get_string("owner") .. ")") + meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner"))) meta:set_string("members", "") end, @@ -323,15 +400,17 @@ minetest.register_node("protector:protect", { local meta = minetest.get_meta(pos) if meta - and protector.can_dig(1, pos,clicker:get_player_name(), true, 1) then - minetest.show_formspec(clicker:get_player_name(), - "protector:node_" .. minetest.pos_to_string(pos), protector.generate_formspec(meta)) + and protector.can_dig(1, pos, clicker:get_player_name(), true, 1) then + + minetest.show_formspec(clicker:get_player_name(), + "protector:node_" .. minetest.pos_to_string(pos), + protector_formspec(meta)) end end, on_punch = function(pos, node, puncher) - if not protector.can_dig(1, pos, puncher:get_player_name(), true, 1) then + if minetest.is_protected(pos, puncher:get_player_name()) then return end @@ -340,7 +419,7 @@ minetest.register_node("protector:protect", { can_dig = function(pos, player) - return protector.can_dig(1, pos, player:get_player_name(), true, 1) + return player and protector.can_dig(1, pos, player:get_player_name(), true, 1) end, on_blast = function() end, @@ -355,16 +434,16 @@ minetest.register_craft({ } }) ---= Protection Logo +-- protection logo minetest.register_node("protector:protect2", { - description = "Protection Logo", + description = S("Protection Logo") .. " (" .. S("USE for area check") .. ")", tiles = {"protector_logo.png"}, wield_image = "protector_logo.png", inventory_image = "protector_logo.png", sounds = default.node_sound_stone_defaults(), groups = {dig_immediate = 2, unbreakable = 1}, - paramtype = 'light', + paramtype = "light", paramtype2 = "wallmounted", legacy_wallmounted = true, light_source = 4, @@ -379,14 +458,14 @@ minetest.register_node("protector:protect2", { }, selection_box = {type = "wallmounted"}, - on_place = protector.check_overlap, + on_place = check_overlap, after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Protection (owned by " .. meta:get_string("owner") .. ")") + meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner"))) meta:set_string("members", "") end, @@ -406,13 +485,13 @@ minetest.register_node("protector:protect2", { if protector.can_dig(1, pos, clicker:get_player_name(), true, 1) then minetest.show_formspec(clicker:get_player_name(), - "protector:node_" .. minetest.pos_to_string(pos), protector.generate_formspec(meta)) + "protector:node_" .. minetest.pos_to_string(pos), protector_formspec(meta)) end end, on_punch = function(pos, node, puncher) - if not protector.can_dig(1, pos, puncher:get_player_name(), true, 1) then + if minetest.is_protected(pos, puncher:get_player_name()) then return end @@ -421,7 +500,7 @@ minetest.register_node("protector:protect2", { can_dig = function(pos, player) - return protector.can_dig(1, pos, player:get_player_name(), true, 1) + return player and protector.can_dig(1, pos, player:get_player_name(), true, 1) end, on_blast = function() end, @@ -436,44 +515,65 @@ minetest.register_craft({ } }) --- If name entered or button press +--[[ +-- 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"} +}) +]] + +-- check formspec buttons or when name entered minetest.register_on_player_receive_fields(function(player, formname, fields) + -- protector formspec found if string.sub(formname, 0, string.len("protector:node_")) == "protector:node_" then local pos_s = string.sub(formname, string.len("protector:node_") + 1) local pos = minetest.string_to_pos(pos_s) local meta = minetest.get_meta(pos) + -- only owner can add names if not protector.can_dig(1, pos, player:get_player_name(), true, 1) then return end + -- add member [+] if fields.protector_add_member then for _, i in pairs(fields.protector_add_member:split(" ")) do - protector.add_member(meta, i) + add_member(meta, i) end end + -- remove member [x] for field, value in pairs(fields) do - if string.sub(field, 0, string.len("protector_del_member_")) == "protector_del_member_" then - protector.del_member(meta, string.sub(field,string.len("protector_del_member_") + 1)) + if string.sub(field, 0, + string.len("protector_del_member_")) == "protector_del_member_" then + + del_member(meta, + string.sub(field,string.len("protector_del_member_") + 1)) end end - + + -- reset formspec until close button pressed if not fields.close_me then - minetest.show_formspec(player:get_player_name(), formname, protector.generate_formspec(meta)) + minetest.show_formspec(player:get_player_name(), formname, protector_formspec(meta)) end - end - end) --- Display entity shown when protector node is punched +-- display entity shown when protector node is punched minetest.register_entity("protector:display", { physical = false, collisionbox = {0, 0, 0, 0, 0, 0}, @@ -483,24 +583,18 @@ minetest.register_entity("protector:display", { textures = {"protector:display_node"}, timer = 0, - on_activate = function(self, staticdata) - - -- Xanadu server only - if mobs and mobs.entity and mobs.entity == false then - self.object:remove() - end - end, - on_step = function(self, dtime) self.timer = self.timer + dtime + -- remove after 5 seconds if self.timer > 5 then self.object:remove() end end, }) + -- Display-zone node, Do NOT place the display as a node, -- it is made to be used as an entity (see above) @@ -534,8 +628,23 @@ minetest.register_node("protector:display_node", { drop = "", }) -dofile(minetest.get_modpath("protector") .. "/doors_chest.lua") -dofile(minetest.get_modpath("protector") .. "/pvp.lua") -dofile(minetest.get_modpath("protector") .. "/admin.lua") -print ("[MOD] Protector Redo loaded") +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 .. "/hud.lua") +dofile(path .. "/lucky_block.lua") + + +-- stop mesecon pistons from pushing protectors +if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("protector:protect") + mesecon.register_mvps_stopper("protector:protect2") + mesecon.register_mvps_stopper("protector:chest") +end + + +print (S("[MOD] Protector Redo loaded")) diff --git a/mods/protector/license.txt b/mods/protector/license.txt index 688aa277..fec6f6aa 100644 --- a/mods/protector/license.txt +++ b/mods/protector/license.txt @@ -1,34 +1,21 @@ +The MIT License (MIT) - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 +Copyright (c) 2016 TenPlus1 - Copyright (C) 2004 Sam Hocevar +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. - - -License of textures --------------------------------------- -following Textures created by Fernando Zapata (CC BY-SA 3.0): - door_wood.png - door_wood_a.png - door_wood_a_r.png - door_wood_b.png - door_wood_b_r.png - -following Textures created by BlockMen (WTFPL): - door_trapdoor.png - -following textures created by sofar (CC-BY-SA-3.0) - doors_trapdoor_steel.png - doors_trapdoor_steel_side.png - door_trapdoor_side.png - -All other door textures (created by PilzAdam): WTFPL +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/protector/locale/de.txt b/mods/protector/locale/de.txt new file mode 100644 index 00000000..4bdc3c43 --- /dev/null +++ b/mods/protector/locale/de.txt @@ -0,0 +1,44 @@ +# German Translation for protector mod +# Deutsche Übersetzung der protector Mod +# last update: 2016/June/5 +# Author: Xanthin + +#admin.lua +Remove Protectors near players with names provided (separate names with spaces) = Entferne Stoerschuetzer von bestimmten Namen in der Naehe von Spielern (trenne Namen durch Leerzeichen) +Protector Names to remove: @1 = Stoerschutznamen zum Entfernen: @1 +Name List Reset = Namensliste zurueckgesetzt + +#doors_chest.lua +Protected Wooden Door = Geschützte Holztür +Protected Steel Door = Geschützte Stahltür +Protected Trapdoor = Geschützte Falltür +Protected Steel Trapdoor = Geschützte Stahlfalltür +Protected Chest = Geschützte Truhe +@1 moves stuff to protected chest at @2 = @1 verlagert Dinge in geschützte Truhe bei @2 +@1 takes stuff from protected chest at @2 = @1 nimmt Dinge aus geschützter Truhe bei @2 +To Chest = Zur Truhe +To Inventory = Zum Inventar +Protected Chest (@1) = Geschützte Truhe (@1) + +#init.lua +-- Protector interface -- = -- Störschutz-Interface -- +PUNCH node to show protected area = SCHLAGE Node, um geschützten Bereich anzuzeigen oder +USE for area check = BENUTZE für Bereichsprüfung +Members: = Mitglieder: +Close = Schließen +This area is owned by @1! = Dieses Gebiet gehoert @1! +This area is owned by @1. = Dieses Gebiet gehoert @1. +Protection located at: @1 = Stoerschutz befindet sich bei: @1 +Members: @1. = Mitglieder: @1. +This area is not protected. = Dieses Gebiet ist nicht geschuetzt. +You can build here. = Du kannst hier bauen. +Overlaps into above players protected area = Ueberlappt in geschuetzen Bereich eines Spielers +Protection Block = Störschutzblock +Protection (owned by @1) = Störschutz (gehört @1) +Protection Logo = Störschutzlogo +[MOD] Protector Redo loaded = [MOD] Protector Redo geladen + +#pvp.lua +[Protector] on_punchplayer called with nil objects = on_punchplayer wurde durch "nil objects" aufgerufen +[Protector] pvp_protect not active, update your version of Minetest = pvp_protect ist nicht aktiv, aktualisiere deine Minetestversion +[Protector] pvp_protect is disabled = pvp_protect ist ausgeschaltet \ No newline at end of file diff --git a/mods/protector/locale/template.txt b/mods/protector/locale/template.txt new file mode 100644 index 00000000..bd277e4f --- /dev/null +++ b/mods/protector/locale/template.txt @@ -0,0 +1,42 @@ +# Template for translations of protector mod +# last update: 2016/June/5 + +#admin.lua +Remove Protectors near players with names provided (separate names with spaces) = +Protector Names to remove: @1 = +Name List Reset = + +#doors_chest.lua +Protected Wooden Door = +Protected Steel Door = +Protected Trapdoor = +Protected Steel Trapdoor = +Protected Chest = +@1 moves stuff to protected chest at @2 = +@1 takes stuff from protected chest at @2 = +To Chest = +To Inventory = +Protected Chest (@1) = + +#init.lua +-- Protector interface -- = +PUNCH node to show protected area = +USE for area check = +Members: = +Close = +This area is owned by @1! = +This area is owned by @1. = +Protection located at: @1 = +Members: @1. = +This area is not protected. = +You can build here. = +Overlaps into above players protected area = +Protection Block = +Protection (owned by @1) = +Protection Logo = +[MOD] Protector Redo loaded = + +#pvp.lua +[Protector] on_punchplayer called with nil objects = +[Protector] pvp_protect not active, update your version of Minetest = +[Protector] pvp_protect is disabled = \ No newline at end of file diff --git a/mods/protector/locale/tr.txt b/mods/protector/locale/tr.txt new file mode 100644 index 00000000..9c3629ed --- /dev/null +++ b/mods/protector/locale/tr.txt @@ -0,0 +1,42 @@ +# Turkish translation by mahmutelmas06 +# last update: 2016/June/5 + +#admin.lua +Remove Protectors near players with names provided (separate names with spaces) = Ismi verilen oyuncuların yanındaki korumaları kaldır. ( İsimleri boşlukla ayır) +Protector Names to remove: @1 = Silinecek korumaların isimleri: @1 +Name List Reset = İsim listesini sıfırla + +#doors_chest.lua +Protected Wooden Door = Korumalı ahşap kapı +Protected Steel Door = Korumalı çelik kapı +Protected Trapdoor = Korumalı tuzak kapısı +Protected Steel Trapdoor = Korumalı çelik tuzak kapısı +Protected Chest = Korumalı sandık +@1 moves stuff to protected chest at @2 = @1 korumalı sandığa birşeyler koydu @2 +@1 takes stuff from protected chest at @2 = @1 korumalı sandıktan birşeyler aldı @2 +To Chest = Sandığa +To Inventory = Envantere +Protected Chest (@1) = Korumalı sandık (@1) + +#init.lua +-- Protector interface -- = +PUNCH node to show protected area = Korunan alanı göstermek için yumruk +USE for area check = Bölge kontrolü için kullan +Members: = Üyeler +Close = Kapat +This area is owned by @1! = Burasının sahibi @1! +This area is owned by @1. = Burasının sahibi @1. +Protection located at: @1 = Korumanın bulunduğu yer @1 +Members: @1. = Üyeler @1. +This area is not protected. = Bu alan korumalı değildir. +You can build here. = Buraya inşaa edebilirsiniz. +Overlaps into above players protected area = +Protection Block = Koruma kutusu +Protection (owned by @1) = Koruma (@1 sahibidir) +Protection Logo = Koruma arması +[MOD] Protector Redo loaded = [MOD] Protector Redo yüklendi + +#pvp.lua +[Protector] on_punchplayer called with nil objects = [Protector] on_punchplayer boş objelerle çağrıldı +[Protector] pvp_protect not active, update your version of Minetest = [Protector] pvp_protect aktif değil, Minetest sürümünüzü güncelleyin. +[Protector] pvp_protect is disabled = [Protector] pvp_protect kapatıldı. diff --git a/mods/protector/lucky_block.lua b/mods/protector/lucky_block.lua new file mode 100644 index 00000000..59c52c19 --- /dev/null +++ b/mods/protector/lucky_block.lua @@ -0,0 +1,18 @@ + +-- add lucky blocks + +if minetest.get_modpath("lucky_block") then + + lucky_block:add_blocks({ + {"dro", {"protector:protect"}, 3}, + {"dro", {"protector:protect2"}, 3}, + {"dro", {"protector:door_wood"}, 1}, + {"dro", {"protector:door_steel"}, 1}, + {"exp", 5, true}, + {"dro", {"protector:trapdoor"}, 1}, + {"dro", {"protector:trapdoor_steel"}, 1}, + {"dro", {"protector:tool"}, 1}, + {"dro", {"protector:chest"}, 1}, + {"exp"}, + }) +end diff --git a/mods/protector/mod.conf b/mods/protector/mod.conf new file mode 100644 index 00000000..8eb0aa8f --- /dev/null +++ b/mods/protector/mod.conf @@ -0,0 +1 @@ +name = protector \ No newline at end of file diff --git a/mods/protector/pvp.lua b/mods/protector/pvp.lua index 0122576f..13822195 100644 --- a/mods/protector/pvp.lua +++ b/mods/protector/pvp.lua @@ -1,22 +1,27 @@ +local S = protector.intllib + -- get static spawn position -local statspawn = (minetest.setting_get_pos("static_spawnpoint") or {x = 0, y = 2, z = 0}) +local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) + or {x = 0, y = 2, z = 0} --- is pvp protection enabled and spawn protected -protector.pvp = minetest.setting_getbool("protector_pvp") -protector.spawn = (tonumber(minetest.setting_get("protector_pvp_spawn")) or 0) +-- is pvp protection enabled +protector.pvp = minetest.settings:get_bool("protector_pvp") --- Disable PVP in your own protected areas -if minetest.setting_getbool("enable_pvp") and protector.pvp then +-- is night-only pvp enabled +protector.night_pvp = minetest.settings:get_bool("protector_night_pvp") + +-- disables PVP in your own protected areas +if minetest.settings:get_bool("enable_pvp") and protector.pvp then if minetest.register_on_punchplayer then - minetest.register_on_punchplayer( - function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + minetest.register_on_punchplayer(function(player, hitter, + time_from_last_punch, tool_capabilities, dir, damage) if not player or not hitter then - print("[Protector] on_punchplayer called with nil objects") + print(S("[Protector] on_punchplayer called with nil objects")) end if not hitter:is_player() then @@ -24,7 +29,7 @@ if minetest.setting_getbool("enable_pvp") and protector.pvp then end -- no pvp at spawn area - local pos = player:getpos() + local pos = player:get_pos() if pos.x < statspawn.x + protector.spawn and pos.x > statspawn.x - protector.spawn @@ -35,17 +40,31 @@ if minetest.setting_getbool("enable_pvp") and protector.pvp then return true end + -- do we enable pvp at night time only ? + if protector.night_pvp then + + -- get time of day + local tod = minetest.get_timeofday() or 0 + + if tod > 0.2 and tod < 0.8 then + -- + else + return false + end + end + + -- is player being punched inside a protected area ? if minetest.is_protected(pos, hitter:get_player_name()) then return true - else - return false end + return false + end) else - print("[Protector] pvp_protect not active, update your version of Minetest") + print(S("[Protector] pvp_protect not active, update your version of Minetest")) end else - print("[Protector] pvp_protect is disabled") + print(S("[Protector] pvp_protect is disabled")) end diff --git a/mods/protector/screenshot.png b/mods/protector/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..641c5f2ef965091ffe4e17f924820576fb418c0b GIT binary patch literal 12165 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 Hu0mjfI~%Xv literal 0 HcmV?d00001 diff --git a/mods/protector/textures/default_chest_front.png b/mods/protector/textures/default_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..f4132794d52be74ba00fc1a05fd403fac4ae7277 GIT binary patch literal 421 zcmV;W0b2fvP)i&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0J2F$K~xwSZNWui!!Q5@z?Cd!Guz>$%=G_{wfA%e z*WN;vk})QQ^Dw*s2*+GX-?@VoV&4O(j+y0L)b(z6#|Hp~%T?|vrG%)s;vZGT7RJ8U z#VjTn08d=l*A4O8LORI+u!*?S_Wowm^QL|PkSL}3czbz1*uCfhoSi3%jH8!XCQkrD zoBe59D|pj90$3wagb+2UuA>0}i+V2Kwbn6Cv;e?#`SbNTmmlSx#8izWM; P00000NkvXXu0mjfwQRVu literal 0 HcmV?d00001 diff --git a/mods/protector/textures/default_chest_side.png b/mods/protector/textures/default_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..44a65a43d3c3f2ba44bceb519a0696e1ba441800 GIT binary patch literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G literal 0 HcmV?d00001 diff --git a/mods/protector/textures/default_chest_top.png b/mods/protector/textures/default_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbdbb94c966b39145bb0f06d30619afb5ba81f8 GIT binary patch literal 418 zcmV;T0bTxyP)nsh*fXFYILEX|{8#G7NJgI1=1NtAU-k#a-k;In$zuXoa@aJiCM zwU1VxfK#S~QIT*zdtp40Y&wEtIDB0)iDE8wS1oK%C}&9`>$iThkYbm5Q>TGSifA}x zPAvL-GKl~H0J}*T^13?f3z@BBeJ!TX$7^M7Dv;V5Xr&G90(|D|=Fb>@h zfFN=yBb)iwm}C#&LacSpY}TvQmm2^avRwQ|ob#T9z5_UlSeIf}MX9v90yq~+D|MT7 zPn1^xI%m?YrASJ-lNEqh*=LNUX_C0j`WryWInQk-nNJh52Qcm;62xsJ8QUHJ1ke6? z-W8!j^kMAf)4=R*X8+q)c0kn>r;gfe_Q+w!YS1S)Bpeg M07*qoM6N<$f@c=8ZU6uP literal 0 HcmV?d00001 diff --git a/mods/protector/textures/johnsmith/moreblocks_circle_stone_bricks.png b/mods/protector/textures/johnsmith/moreblocks_circle_stone_bricks.png deleted file mode 100644 index 17aed51a4d5ecd5ef9e267bd44d131db9e100639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 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 diff --git a/mods/protector/tool.lua b/mods/protector/tool.lua new file mode 100644 index 00000000..116758a9 --- /dev/null +++ b/mods/protector/tool.lua @@ -0,0 +1,124 @@ + +-- protector placement tool (thanks to Shara for code and idea) + +minetest.register_craftitem("protector:tool", { + description = "Protector Placer Tool (stand near protector, face direction and use)", + inventory_image = "protector_display.png^protector_logo.png", + stack_max = 1, + + on_use = function(itemstack, user, pointed_thing) + + local name = user:get_player_name() + + -- check for protector near player (2 block radius) + local pos = user:get_pos() + local pp = minetest.find_nodes_in_area( + vector.subtract(pos, 2), vector.add(pos, 2), + {"protector:protect", "protector:protect2"}) + + if #pp == 0 then return end -- none found + + pos = pp[1] -- take position of first protector found + + -- get members on protector + local meta = minetest.get_meta(pos) + local members = meta:get_string("members") or "" + + -- 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 + local pit = user:get_look_pitch() + + -- set placement coords + if pit > 1.2 then + vec.y = gap -- up + elseif pit < -1.2 then + vec.y = -gap -- down + elseif 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 nod + 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 (block first then logo) + if inv:contains_item("main", "protector:protect") then + + inv:remove_item("main", "protector:protect") + nod = "protector:protect" + + elseif inv:contains_item("main", "protector:protect2") then + + inv:remove_item("main", "protector:protect2") + nod = "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 .. ")") + + -- copy members across if holding sneak when using tool + if user:get_player_control().sneak then + meta:set_string("members", members) + else + meta:set_string("members", "") + end + + minetest.chat_send_player(name, + "Protector placed at " .. minetest.pos_to_string(pos)) + + 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"}, + } +})