pax_global_header00006660000000000000000000000064141121631530014507gustar00rootroot0000000000000052 comment=493f74d63fbc4c92290761ae3180df74142820f2 protector/000077500000000000000000000000001411216315300130745ustar00rootroot00000000000000protector/README.md000066400000000000000000000145201411216315300143550ustar00rootroot00000000000000Protector 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 rewritten by TenPlus1. https://forum.minetest.net/viewtopic.php?f=11&t=9376 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 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 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 to and from protected chest - 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 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) 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 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) - 2.6 - Add protection against CSM tampering, updated Intllib support (thanks codexp), tweaked block textures - 2.7 - Remove protection field entity when protector has been dug - 2.8 - Added 'protector_show_interval' setting to minetest.conf [default is 5], make protection field glow in dark. - 2.9 - Added MineClone2 recipes for protection block but no official support as yet - 3.0 - Added PlayerFactions support, 'protector_hud_interval' setting and listing in advanced settings for mod values. - 3.1 - Ability to hide protection blocks using /protector_hide and /protector_show , italian local added (thanks Hamlet) - 3.2 - Defaults to Minetest translation if found, otherwise intllib fallback if loaded, locale files updated for both. Added 'protector_msg' setting for player text. - 3.3 - Added support for playerfactions new api (thanks louisroyer), added limiter to protection radius of 22. Lucky Blocks: 10 Usage: (requires server privelage) list names to remove /protector_remove remove specific user names /protector_remove name1 name2 remove all names from list /protector_remove - Whenever a player is near any protectors with name1 or name2 then it will be 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_area A players own protection blocks can be hidden and shown using the following: /protector_hide /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_show_interval - Number of seconds the protection field is visible, defaults to 5 seconds. protector_recipe = true - When true allows players to craft protection blocks protector_msg = true - When true shows protection messages in players chat when trying to interact in someone else's area 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. protector/admin.lua000066400000000000000000000124431411216315300146730ustar00rootroot00000000000000 local S = protector.intllib local removal_names = "" local replace_names = "" minetest.register_chatcommand("protector_remove", { params = S(""), description = S("Remove Protectors around players (separate names with spaces)"), privs = {server = true}, func = function(name, param) if not param or param == "" then minetest.chat_send_player(name, S("Protector Names to remove: @1", removal_names)) return end if param == "-" then minetest.chat_send_player(name, S("Name List Reset")) removal_names = "" return end removal_names = param end, }) minetest.register_chatcommand("protector_replace", { params = S(" "), 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")) replace_names = "" return end -- show name info if param == "" and replace_names ~= "" then local names = replace_names:split(" ") minetest.chat_send_player(name, S("Replacing Protector name @1 with @2", names[1] or "", names[2] or "")) return end replace_names = param end, }) minetest.register_abm({ nodenames = {"protector:protect", "protector:protect2", "protector:protect_hidden"}, interval = 6, chance = 1, catch_up = false, action = function(pos, node) if removal_names == "" and replace_names == "" then return end local meta = minetest.get_meta(pos) if not meta then return end local owner = meta:get_string("owner") if removal_names ~= "" then local names = removal_names:split(" ") for _, n in pairs(names) do if n == owner then minetest.set_node(pos, {name = "air"}) end end end if replace_names ~= "" then local names = replace_names:split(" ") if names[1] and names[2] and owner == names[1] then meta:set_string("owner", names[2]) meta:set_string("infotext", S("Protection (owned by @1)", names[2])) end end end }) -- get protection radius local r = tonumber(minetest.settings:get("protector_radius")) or 5 -- show protection areas of nearby protectors owned by you (thanks agaran) minetest.register_chatcommand("protector_show_area", { params = "", description = S("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() -- 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", "protector:protect_hidden"}) 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 or minetest.check_player_privs(name, {protection_bypass = true}) then minetest.add_entity(pos[n], "protector:display") end end end }) -- ability to hide protection blocks (borrowed from doors mod :) minetest.register_node("protector:protect_hidden", { description = "Hidden Protector", drawtype = "airlike", paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, -- has to be walkable for falling nodes to stop falling walkable = true, pointable = false, diggable = false, buildable_to = false, floodable = false, drop = "", groups = {not_in_creative_inventory = 1, unbreakable = 1}, on_blast = function() end, -- 1px block inside door hinge near node top collision_box = { type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, }, }) minetest.register_chatcommand("protector_show", { params = "", description = S("Show your nearby protection blocks"), privs = {interact = true}, func = function(name, param) local player = minetest.get_player_by_name(name) if not player then return false, "Player not found" end local pos = player:get_pos() local a = 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_hidden"}) local meta, owner for _, row in pairs(a) do meta = minetest.get_meta(row) owner = meta:get_string("owner") or "" if owner == name or minetest.check_player_privs(name, {protection_bypass = true}) then minetest.swap_node(row, {name = "protector:protect"}) end end end }) minetest.register_chatcommand("protector_hide", { params = "", description = S("Hide your nearby protection blocks"), privs = {interact = true}, func = function(name, param) local player = minetest.get_player_by_name(name) if not player then return false, "Player not found" end local pos = player:get_pos() local a = 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 for _, row in pairs(a) do meta = minetest.get_meta(row) owner = meta:get_string("owner") or "" if owner == name or minetest.check_player_privs(name, {protection_bypass = true}) then minetest.swap_node(row, {name = "protector:protect_hidden"}) end end end }) protector/depends.txt000066400000000000000000000000761411216315300152620ustar00rootroot00000000000000default? intllib? lucky_block? mesecons_mvps? playerfactions? protector/description.txt000066400000000000000000000001221411216315300161530ustar00rootroot00000000000000Lets players craft special blocks to protect their builds or disable PVP in areas.protector/doors_chest.lua000066400000000000000000000453241411216315300161230ustar00rootroot00000000000000 -- 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 -- within this mod for local use. local S = protector.intllib local F = minetest.formspec_escape -- MineClone2 support local mcl = not minetest.registered_items["default:steel_ingot"] -- Registers a door function register_door(name, def) def.groups.not_in_creative_inventory = 1 local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} def.node_box_bottom = box def.node_box_top = box def.selection_box_bottom = box def.selection_box_top = box def.sound_close_door = "doors_door_close" def.sound_open_door = "doors_door_open" minetest.register_craftitem(name, { description = def.description, inventory_image = def.inventory_image, on_place = function(itemstack, placer, pointed_thing) if not pointed_thing.type == "node" then return itemstack end local ptu = pointed_thing.under local nu = minetest.get_node(ptu) if minetest.registered_nodes[nu.name] and minetest.registered_nodes[nu.name].on_rightclick then return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) end local pt = pointed_thing.above local pt2 = {x=pt.x, y=pt.y, z=pt.z} pt2.y = pt2.y+1 if not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or not placer or not placer:is_player() then return itemstack end if minetest.is_protected(pt, placer:get_player_name()) or minetest.is_protected(pt2, placer:get_player_name()) then minetest.record_protection_violation(pt, placer:get_player_name()) return itemstack end local p2 = minetest.dir_to_facedir(placer:get_look_dir()) local pt3 = {x=pt.x, y=pt.y, z=pt.z} if p2 == 0 then pt3.x = pt3.x-1 elseif p2 == 1 then pt3.z = pt3.z+1 elseif p2 == 2 then pt3.x = pt3.x+1 elseif p2 == 3 then pt3.z = pt3.z-1 end if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then minetest.set_node(pt, {name=name.."_b_1", param2=p2}) minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) else minetest.set_node(pt, {name=name.."_b_2", param2=p2}) minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) minetest.get_meta(pt):set_int("right", 1) minetest.get_meta(pt2):set_int("right", 1) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end return itemstack end, }) local tt = def.tiles_top local tb = def.tiles_bottom local function after_dig_node(pos, name, digger) local node = minetest.get_node(pos) if node.name == name then minetest.node_dig(pos, node, digger) end end local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) pos.y = pos.y+dir if minetest.get_node(pos).name ~= check_name then return end local p2 = minetest.get_node(pos).param2 p2 = params[p2+1] minetest.swap_node(pos, {name=replace_dir, param2=p2}) pos.y = pos.y-dir minetest.swap_node(pos, {name=replace, param2=p2}) local snd_1 = def.sound_close_door local snd_2 = def.sound_open_door if params[1] == 3 then snd_1 = def.sound_open_door snd_2 = def.sound_close_door end if minetest.get_meta(pos):get_int("right") ~= 0 then minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) else minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) end end local function on_rotate(pos, node, dir, user, check_name, mode, new_param2) if mode ~= screwdriver.ROTATE_FACE then return false end pos.y = pos.y + dir if not minetest.get_node(pos).name == check_name then return false end if minetest.is_protected(pos, user:get_player_name()) then minetest.record_protection_violation(pos, user:get_player_name()) return false end local node2 = minetest.get_node(pos) node2.param2 = (node2.param2 + 1) % 4 minetest.swap_node(pos, node2) pos.y = pos.y - dir node.param2 = (node.param2 + 1) % 4 minetest.swap_node(pos, node) return true end minetest.register_node(name.."_b_1", { tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, drop = name, drawtype = "nodebox", node_box = { type = "fixed", fixed = def.node_box_bottom }, selection_box = { type = "fixed", fixed = def.selection_box_bottom }, groups = def.groups, after_dig_node = function(pos, oldnode, oldmetadata, digger) pos.y = pos.y+1 after_dig_node(pos, name.."_t_1", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) end end, on_rotate = function(pos, node, user, mode, new_param2) return on_rotate(pos, node, 1, user, name.."_t_1", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, on_blast = function() end, }) minetest.register_node(name.."_t_1", { tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, drop = "", drawtype = "nodebox", node_box = { type = "fixed", fixed = def.node_box_top }, selection_box = { type = "fixed", fixed = def.selection_box_top }, groups = def.groups, after_dig_node = function(pos, oldnode, oldmetadata, digger) pos.y = pos.y-1 after_dig_node(pos, name.."_b_1", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) end end, on_rotate = function(pos, node, user, mode, new_param2) return on_rotate(pos, node, -1, user, name.."_b_1", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, on_blast = function() end, }) minetest.register_node(name.."_b_2", { tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, drop = name, drawtype = "nodebox", node_box = { type = "fixed", fixed = def.node_box_bottom }, selection_box = { type = "fixed", fixed = def.selection_box_bottom }, groups = def.groups, after_dig_node = function(pos, oldnode, oldmetadata, digger) pos.y = pos.y+1 after_dig_node(pos, name.."_t_2", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) end end, on_rotate = function(pos, node, user, mode, new_param2) return on_rotate(pos, node, 1, user, name.."_t_2", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, on_blast = function() end, }) minetest.register_node(name.."_t_2", { tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]}, paramtype = "light", paramtype2 = "facedir", use_texture_alpha = "clip", is_ground_content = false, drop = "", drawtype = "nodebox", node_box = { type = "fixed", fixed = def.node_box_top }, selection_box = { type = "fixed", fixed = def.selection_box_top }, groups = def.groups, after_dig_node = function(pos, oldnode, oldmetadata, digger) pos.y = pos.y-1 after_dig_node(pos, name.."_b_2", digger) end, on_rightclick = function(pos, node, clicker) if not minetest.is_protected(pos, clicker:get_player_name()) then on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) end end, on_rotate = function(pos, node, user, mode, new_param2) return on_rotate(pos, node, -1, user, name.."_b_2", mode) end, sounds = def.sounds, sunlight_propagates = def.sunlight, on_blast = function() end, }) end -- Protected Wooden Door local name = "protector:door_wood" register_door(name, { description = S("Protected Wooden Door"), inventory_image = "doors_wood.png^protector_logo.png", groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, unbreakable = 1, --door = 1 }, tiles_bottom = {"doors_wood_b.png^protector_logo.png", "doors_brown.png"}, tiles_top = {"doors_wood_a.png", "doors_brown.png"}, sounds = default.node_sound_wood_defaults(), sunlight = false, }) if mcl then minetest.register_craft({ output = name, recipe = { {"mcl_doors:wooden_door", "mcl_core:gold_ingot"} } }) else minetest.register_craft({ output = name, recipe = { {"group:wood", "group:wood"}, {"group:wood", "default:copper_ingot"}, {"group:wood", "group:wood"} } }) minetest.register_craft({ output = name, recipe = { {"doors:door_wood", "default:copper_ingot"} } }) end -- Protected Steel Door local name = "protector:door_steel" register_door(name, { description = S("Protected Steel Door"), inventory_image = "doors_steel.png^protector_logo.png", groups = { snappy = 1, bendy = 2, cracky = 1, level = 2, unbreakable = 1, -- door = 1 }, tiles_bottom = {"doors_steel_b.png^protector_logo.png", "doors_grey.png"}, tiles_top = {"doors_steel_a.png", "doors_grey.png"}, sounds = default.node_sound_wood_defaults(), sunlight = false, }) if mcl then minetest.register_craft({ output = name, recipe = { {"mcl_doors:iron_door", "mcl_core:gold_ingot"} } }) else minetest.register_craft({ output = name, recipe = { {"default:steel_ingot", "default:steel_ingot"}, {"default:steel_ingot", "default:copper_ingot"}, {"default:steel_ingot", "default:steel_ingot"} } }) minetest.register_craft({ output = name, recipe = { {"doors:door_steel", "default:copper_ingot"} } }) end ----trapdoor---- function register_trapdoor(name, def) local name_closed = name local name_opened = name.."_open" def.on_rightclick = function (pos, node, clicker, itemstack, pointed_thing) if minetest.is_protected(pos, clicker:get_player_name()) then return end local newname = node.name == name_closed and name_opened or name_closed local sound = false if node.name == name_closed then sound = "doors_door_open" end if node.name == name_opened then sound = "doors_door_close" end if sound then minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10}) end minetest.swap_node(pos, {name = newname, param1 = node.param1, param2 = node.param2}) end -- Common trapdoor configuration def.drawtype = "nodebox" def.paramtype = "light" def.paramtype2 = "facedir" def.use_texture_alpha = "clip" def.is_ground_content = false local def_opened = table.copy(def) local def_closed = table.copy(def) def_closed.node_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } def_closed.selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side, def.tile_side, def.tile_side } def_opened.node_box = { type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } def_opened.selection_box = { type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } def_opened.tiles = { def.tile_side, def.tile_side, def.tile_side .. "^[transform3", def.tile_side .. "^[transform1", def.tile_front, def.tile_front } def_opened.drop = name_closed def_opened.groups.not_in_creative_inventory = 1 minetest.register_node(name_opened, def_opened) minetest.register_node(name_closed, def_closed) end -- Protected Wooden Trapdoor register_trapdoor("protector: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", tile_side = "doors_trapdoor_side.png", groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, unbreakable = 1, --door = 1 }, sounds = default.node_sound_wood_defaults(), }) if mcl then minetest.register_craft({ output = "protector:trapdoor", recipe = { {"mcl_doors:trapdoor", "mcl_core:gold_ingot"} } }) else minetest.register_craft({ output = "protector:trapdoor 2", recipe = { {"group:wood", "default:copper_ingot", "group:wood"}, {"group:wood", "group:wood", "group:wood"}, } }) minetest.register_craft({ output = "protector:trapdoor", recipe = { {"doors:trapdoor", "default:copper_ingot"} } }) end -- Protected Steel Trapdoor register_trapdoor("protector:trapdoor_steel", { 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", tile_side = "doors_trapdoor_steel_side.png", groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2, unbreakable = 1, --door = 1 }, sounds = default.node_sound_wood_defaults(), }) if mcl then minetest.register_craft({ output = "protector:trapdoor_steel", recipe = { {"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"} } }) else minetest.register_craft({ output = "protector:trapdoor_steel", recipe = { {"default:copper_ingot", "default:steel_ingot"}, {"default:steel_ingot", "default:steel_ingot"}, } }) minetest.register_craft({ output = "protector:trapdoor_steel", recipe = { {"doors:trapdoor_steel", "default:copper_ingot"} } }) end -- Protected Chest minetest.register_node("protector:chest", { description = S("Protected Chest"), tiles = { "default_chest_top.png", "default_chest_top.png", "default_chest_side.png", "default_chest_side.png", "default_chest_side.png", "default_chest_front.png^protector_logo.png" }, paramtype2 = "facedir", groups = {choppy = 2, oddly_breakable_by_hand = 2, unbreakable = 1}, legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() meta:set_string("infotext", S("Protected Chest")) meta:set_string("name", S("Protected Chest")) inv:set_size("main", 8 * 4) end, can_dig = function(pos,player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if inv:is_empty("main") then if not minetest.is_protected(pos, player:get_player_name()) then return true end end end, 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)) 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)) end, on_metadata_inventory_move = function( pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name() .. " moves stuff inside protected chest at " .. 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) if minetest.is_protected(pos, clicker:get_player_name()) then return end local meta = minetest.get_meta(pos) if not meta then return end local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]" .. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]" .. "image_button[-0.01,4.26;1.05,0.8;protector_up_icon.png;protect_up;]" .. "image_button[0.98,4.26;1.05,0.8;protector_down_icon.png;protect_down;]" .. "tooltip[protect_up;" .. S("To Chest") .. "]" .. "tooltip[protect_down;" .. S("To Inventory") .. "]" .. "field[2.3,4.8;4,0.25;protect_name;;" .. meta:get_string("name") .. "]" .. "button[5.99,4.5;2.05,0.25;protect_rename;" .. S("Rename") .. "]" .. "list[current_player;main;0,5;8,1;]" .. "list[current_player;main;0,6.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" minetest.show_formspec( clicker:get_player_name(), "protector:chest_" .. minetest.pos_to_string(pos), formspec) end, on_blast = function() end, }) -- Container transfer helper local to_from = function(src, dst) local stack, item, leftover local size = dst:get_size("main") for i = 1, size do stack = src:get_stack("main", i) item = stack:get_name() if item ~= "" and dst:room_for_item("main", item) then leftover = dst:add_item("main", stack) if leftover and not leftover:is_empty() then src:set_stack("main", i, leftover) else src:set_stack("main", i, nil) end end end end -- Protected Chest formspec buttons minetest.register_on_player_receive_fields(function(player, formname, fields) if string.sub(formname, 0, 16) ~= "protector:chest_" then return end local pos_s = string.sub(formname, 17) 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() -- copy contents of player inventory to chest if fields.protect_up then to_from(player_inv, chest_inv) -- copy contents of chest to player inventory elseif fields.protect_down then to_from(chest_inv, player_inv) elseif fields.protect_name or fields.protect_rename then -- change chest infotext to display name if fields.protect_name ~= "" then meta:set_string("name", fields.protect_name) meta:set_string("infotext", fields.protect_name) else meta:set_string("name", S("Protected Chest")) meta:set_string("infotext", S("Protected Chest")) end end end) -- Protected Chest recipes if mcl then minetest.register_craft({ output = "protector:chest", recipe = { {"mcl_chests:chest", "mcl_core:gold_ingot"}, } }) else minetest.register_craft({ output = "protector:chest", recipe = { {"group:wood", "group:wood", "group:wood"}, {"group:wood", "default:copper_ingot", "group:wood"}, {"group:wood", "group:wood", "group:wood"}, } }) minetest.register_craft({ output = "protector:chest", recipe = { {"default:chest", "default:copper_ingot"}, } }) end protector/hud.lua000066400000000000000000000031541411216315300143620ustar00rootroot00000000000000 local S = protector.intllib local radius = (tonumber(minetest.settings:get("protector_radius")) or 5) -- radius limiter (minetest cannot handle node volume of more than 4096000) if radius > 22 then radius = 22 end local hud = {} local hud_timer = 0 local hud_interval = (tonumber(minetest.settings:get("protector_hud_interval")) or 5) if hud_interval > 0 then minetest.register_globalstep(function(dtime) -- every 5 seconds hud_timer = hud_timer + dtime if hud_timer < hud_interval 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:get_pos()) local hud_text = "" 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", "protector:protect_hidden"}) if #protectors > 0 then local npos = protectors[1] local meta = minetest.get_meta(npos) local nodeowner = meta:get_string("owner") hud_text = S("Owner: @1", 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) end protector/init.lua000066400000000000000000000454251411216315300145540ustar00rootroot00000000000000 -- default support (for use with MineClone2 and other [games] default = default or { node_sound_stone_defaults = function(table) end, node_sound_wood_defaults = function(table) end, gui_bg = "", gui_bg_img = "", gui_slots = "" } -- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) local F = minetest.formspec_escape local S = minetest.get_translator and minetest.get_translator("protector") or dofile(MP .. "/intllib.lua") -- Load support for factions local factions_available = minetest.global_exists("factions") protector = { mod = "redo", modpath = MP, intllib = S } local protector_max_share_count = 12 -- get minetest.conf settings local protector_radius = tonumber(minetest.settings:get("protector_radius")) or 5 local protector_flip = minetest.settings:get_bool("protector_flip") or false local protector_hurt = tonumber(minetest.settings:get("protector_hurt")) or 0 local protector_spawn = tonumber(minetest.settings:get("protector_spawn") or minetest.settings:get("protector_pvp_spawn")) or 0 local protector_show = tonumber(minetest.settings:get("protector_show_interval")) or 5 local protector_recipe = minetest.settings:get_bool("protector_recipe") ~= false local protector_msg = minetest.settings:get_bool("protector_msg") ~= false -- radius limiter (minetest cannot handle node volume of more than 4096000) if protector_radius > 22 then protector_radius = 22 end -- get static spawn position local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) or {x = 0, y = 2, z = 0} -- return list of members as a table local get_member_list = function(meta) return meta:get_string("members"):split(" ") end -- write member list table in protector meta as string local set_member_list = function(meta, list) meta:set_string("members", table.concat(list, " ")) end -- 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) if factions_available and meta:get_int("faction_members") == 1 then if factions.version == nil then -- backward compatibility if factions.get_player_faction(name) ~= nil and factions.get_player_faction(meta:get_string("owner")) == factions.get_player_faction(name) then return true end else -- is member if player and owner share at least one faction local owner_factions = factions.get_player_factions(name) local owner = meta:get_string("owner") if owner_factions ~= nil and owner_factions ~= false then for _, f in ipairs(owner_factions) do if factions.player_is_in_faction(f, owner) then return true end end end end end for _, n in pairs(get_member_list(meta)) do if n == name then return true end end return false end -- add player name to table as member local add_member = function(meta, name) -- Constant (20) defined by player.h if name:len() > 25 then return end -- does name already exist? if is_owner(meta, name) or is_member(meta, name) then return end local list = get_member_list(meta) if #list >= protector_max_share_count then return end table.insert(list, name) set_member_list(meta, list) end -- remove player name from table local del_member = function(meta, name) local list = get_member_list(meta) for i, n in pairs(list) do if n == name then table.remove(list, i) break end end set_member_list(meta, list) end -- 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;" .. F(S("-- Protector interface --")) .. "]" .. "label[0,1;" .. F(S("PUNCH node to show protected area")) .. "]" .. "label[0,2;" .. F(S("Members:")) .. "]" .. "button_exit[2.5,6.2;3,0.5;close_me;" .. F(S("Close")) .. "]" .. "field_close_on_enter[protector_add_member;false]" local members = get_member_list(meta) local npp = protector_max_share_count -- max users added to protector list local i = 0 local checkbox_faction = false -- Display the checkbox only if the owner is member of at least 1 faction if factions_available then if factions.version == nil then -- backward compatibility if factions.get_player_faction(meta:get_string("owner")) then checkbox_faction = true end else local player_factions = factions.get_player_factions(meta:get_string("owner")) if player_factions ~= nil and #player_factions >= 1 then checkbox_faction = true end end end if checkbox_faction then formspec = formspec .. "checkbox[0,5;faction_members;" .. F(S("Allow faction access")) .. ";" .. (meta:get_int("faction_members") == 1 and "true" or "false") .. "]" if npp > 8 then npp = 8 end end 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;" .. F(members[n]) .. "]" -- username remove button .. "button[" .. (i % 4 * 2 + 1.25) .. "," .. math.floor(i / 4 + 3) .. ";.75,.5;protector_del_member_" .. F(members[n]) .. ";X]" end i = i + 1 end if i < npp then -- user name entry field formspec = formspec .. "field[" .. (i % 4 * 2 + 1 / 3) .. "," .. (math.floor(i / 4 + 3) + 1 / 3) .. ";1.433,.5;protector_add_member;;]" -- username add button .."button[" .. (i % 4 * 2 + 1.25) .. "," .. math.floor(i / 4 + 3) .. ";.75,.5;protector_submit;+]" end 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 -- show protection message if enabled local show_msg = function(player, msg) -- if messages disabled or no player name provided if protector_msg == false or not player or player == "" then return end minetest.chat_send_player(player, msg) end -- Infolevel: -- 0 for no info -- 1 for "This area is owned by !" if you can't dig -- 2 for "This area is owned by . -- 3 for checking protector overlaps protector.can_dig = function(r, pos, digger, onlyowner, infolevel) if not digger or not pos then return false end -- 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 -- is spawn area protected ? if inside_spawn(pos, protector_spawn) then show_msg(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", "protector:protect_hidden"}) local meta, owner, members for n = 1, #pos do meta = minetest.get_meta(pos[n]) owner = meta:get_string("owner") or "" members = meta:get_string("members") or "" -- node change and digger isn't owner if infolevel == 1 and owner ~= digger then -- and you aren't on the member list if onlyowner or not is_member(meta, digger) then show_msg(digger, S("This area is owned by @1", owner) .. "!") return false end end -- when using protector as tool, show protector information if infolevel == 2 then minetest.chat_send_player(digger, S("This area is owned by @1", owner) .. ".") minetest.chat_send_player(digger, S("Protection located at: @1", minetest.pos_to_string(pos[n]))) if members ~= "" then minetest.chat_send_player(digger, S("Members: @1.", members)) end return false end end -- show when you can build on unprotected area if infolevel == 2 then if #pos < 1 then minetest.chat_send_player(digger, S("This area is not protected.")) end minetest.chat_send_player(digger, S("You can build here.")) end return true end 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) if player and player:is_player() then -- hurt player if protection violated if protector_hurt > 0 and player:get_hp() > 0 then -- This delay fixes item duplication bug (thanks luk3yx) minetest.after(0.1, function(player) player:set_hp(player:get_hp() - protector_hurt) end, player) end -- flip player when protection violated if protector_flip then -- yaw + 180° local yaw = player:get_look_horizontal() + math.pi if yaw > 2 * math.pi then yaw = yaw - 2 * math.pi end player:set_look_horizontal(yaw) -- invert pitch player:set_look_vertical(-player:get_look_vertical()) -- 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:set_pos({ x = pla_pos.x, y = pla_pos.y + 0.8, z = pla_pos.z }) end end end return true end -- otherwise can dig or place return old_is_protected(pos, digger) end -- 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 local pos = pointed_thing.above local name = placer:get_player_name() -- make sure protector doesn't overlap onto protected spawn area if inside_spawn(pos, protector_spawn + protector_radius) then 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 -- remove protector display entities local del_display = function(pos) local objects = minetest.get_objects_inside_radius(pos, 0.5) for _, v in ipairs(objects) do if v and v:get_luaentity() and v:get_luaentity().name == "protector:display" then v:remove() end end end -- temporary pos store local player_pos = {} -- protection node minetest.register_node("protector:protect", { description = S("Protection Block") .. " (" .. S("USE for area check") .. ")", drawtype = "nodebox", tiles = { "default_stone.png^protector_overlay.png", "default_stone.png^protector_overlay.png", "default_stone.png^protector_overlay.png^protector_logo.png" }, sounds = default.node_sound_stone_defaults(), groups = {dig_immediate = 2, unbreakable = 1}, is_ground_content = false, paramtype = "light", light_source = 4, node_box = { type = "fixed", fixed = { {-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5}, } }, 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("members", "") meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner"))) end, on_use = function(itemstack, user, pointed_thing) if pointed_thing.type ~= "node" then return end protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2) end, on_rightclick = function(pos, node, clicker, itemstack) local meta = minetest.get_meta(pos) local name = clicker:get_player_name() if meta and protector.can_dig(1, pos, name, true, 1) then player_pos[name] = pos minetest.show_formspec(name, "protector:node", protector_formspec(meta)) end end, on_punch = function(pos, node, puncher) if minetest.is_protected(pos, puncher:get_player_name()) then return end minetest.add_entity(pos, "protector:display") end, can_dig = function(pos, player) return player and protector.can_dig(1, pos, player:get_player_name(), true, 1) end, on_blast = function() end, after_destruct = del_display }) -- default recipe and alternative for MineClone2 if protector_recipe then if minetest.registered_items["default:stone"] then minetest.register_craft({ output = "protector:protect", recipe = { {"default:stone", "default:stone", "default:stone"}, {"default:stone", "default:gold_ingot", "default:stone"}, {"default:stone", "default:stone", "default:stone"}, } }) else minetest.register_craft({ output = "protector:protect", recipe = { {"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"}, {"mcl_core:stone", "mcl_core:gold_ingot", "mcl_core:stone"}, {"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"}, } }) end end -- protection logo minetest.register_node("protector:protect2", { 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}, use_texture_alpha = "clip", paramtype = "light", paramtype2 = "wallmounted", legacy_wallmounted = true, light_source = 4, drawtype = "nodebox", sunlight_propagates = true, walkable = true, node_box = { type = "wallmounted", wall_top = {-0.375, 0.4375, -0.5, 0.375, 0.5, 0.5}, wall_bottom = {-0.375, -0.5, -0.5, 0.375, -0.4375, 0.5}, wall_side = {-0.5, -0.5, -0.375, -0.4375, 0.5, 0.375}, }, selection_box = {type = "wallmounted"}, 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("members", "") meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner"))) end, on_use = function(itemstack, user, pointed_thing) if pointed_thing.type ~= "node" then return end protector.can_dig(protector_radius, pointed_thing.under, user:get_player_name(), false, 2) end, on_rightclick = function(pos, node, clicker, itemstack) local meta = minetest.get_meta(pos) local name = clicker:get_player_name() if meta and protector.can_dig(1, pos, name, true, 1) then player_pos[name] = pos minetest.show_formspec(name, "protector:node", protector_formspec(meta)) end end, on_punch = function(pos, node, puncher) if minetest.is_protected(pos, puncher:get_player_name()) then return end minetest.add_entity(pos, "protector:display") end, can_dig = function(pos, player) return player and protector.can_dig(1, pos, player:get_player_name(), true, 1) end, on_blast = function() end, after_destruct = del_display }) -- recipes to switch between protectors minetest.register_craft({ output = "protector:protect", recipe = {{"protector:protect2"}} }) minetest.register_craft({ output = "protector:protect2", recipe = {{"protector:protect"}} }) -- check formspec buttons or when name entered minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "protector:node" then return end local name = player:get_player_name() local pos = player_pos[name] if not name or not pos then return end local add_member_input = fields.protector_add_member -- reset formspec until close button pressed if (fields.close_me or fields.quit) and (not add_member_input or add_member_input == "") then player_pos[name] = nil return end -- only owner can add names if not protector.can_dig(1, pos, player:get_player_name(), true, 1) then return end -- are we adding member to a protection node ? (csm protection) local nod = minetest.get_node(pos).name if nod ~= "protector:protect" and nod ~= "protector:protect2" then player_pos[name] = nil return end local meta = minetest.get_meta(pos) if not meta then return end -- add faction members if factions_available then meta:set_int("faction_members", fields.faction_members == "true" and 1 or 0) end -- add member [+] if add_member_input then for _, i in pairs(add_member_input:split(" ")) do 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 del_member(meta, string.sub(field,string.len("protector_del_member_") + 1)) end end minetest.show_formspec(name, formname, protector_formspec(meta)) end) -- display entity shown when protector node is punched minetest.register_entity("protector:display", { physical = false, collisionbox = {0, 0, 0, 0, 0, 0}, visual = "wielditem", -- wielditem seems to be scaled to 1.5 times original node size visual_size = {x = 0.67, y = 0.67}, textures = {"protector:display_node"}, timer = 0, glow = 10, on_step = function(self, dtime) self.timer = self.timer + dtime -- remove after set number of seconds if self.timer > protector_show 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) local x = protector_radius minetest.register_node("protector:display_node", { tiles = {"protector_display.png"}, use_texture_alpha = "clip", -- true, walkable = false, drawtype = "nodebox", node_box = { type = "fixed", fixed = { -- sides {-(x+.55), -(x+.55), -(x+.55), -(x+.45), (x+.55), (x+.55)}, {-(x+.55), -(x+.55), (x+.45), (x+.55), (x+.55), (x+.55)}, {(x+.45), -(x+.55), -(x+.55), (x+.55), (x+.55), (x+.55)}, {-(x+.55), -(x+.55), -(x+.55), (x+.55), (x+.55), -(x+.45)}, -- top {-(x+.55), (x+.45), -(x+.55), (x+.55), (x+.55), (x+.55)}, -- bottom {-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)}, -- middle (surround protector) {-.55,-.55,-.55, .55,.55,.55}, }, }, selection_box = { type = "regular", }, paramtype = "light", groups = {dig_immediate = 3, not_in_creative_inventory = 1}, drop = "", }) dofile(MP .. "/doors_chest.lua") dofile(MP .. "/pvp.lua") dofile(MP .. "/admin.lua") dofile(MP .. "/tool.lua") dofile(MP .. "/hud.lua") dofile(MP .. "/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 ("[MOD] Protector Redo loaded") protector/intllib.lua000066400000000000000000000021421411216315300152330ustar00rootroot00000000000000 -- Fallback functions for when `intllib` is not installed. -- Code released under Unlicense . -- Get the latest version of this file at: -- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua local function format(str, ...) local args = { ... } local function repl(escape, open, num, close) if escape == "" then local replacement = tostring(args[tonumber(num)]) if open == "" then replacement = replacement..close end return replacement else return "@"..open..num..close end end return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) end local gettext, ngettext if minetest.get_modpath("intllib") then if intllib.make_gettext_pair then -- New method using gettext. gettext, ngettext = intllib.make_gettext_pair() else -- Old method using text files. gettext = intllib.Getter() end end -- Fill in missing functions. gettext = gettext or function(msgid, ...) return format(msgid, ...) end ngettext = ngettext or function(msgid, msgid_plural, n, ...) return format(n==1 and msgid or msgid_plural, ...) end return gettext, ngettext protector/license.txt000066400000000000000000000020631411216315300152600ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 TenPlus1 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 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. protector/locale/000077500000000000000000000000001411216315300143335ustar00rootroot00000000000000protector/locale/de.po000066400000000000000000000104641411216315300152700ustar00rootroot00000000000000# German translation for PROTECTOR MOD. # Copyright (C) 2018 TenPlus1 # This file is distributed under the same license as the PROTECTOR MOD package. # Xanthin , 2016. # CodeXP , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Last-Translator: CodeXP \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Entferne Störschützer von bestimmten Namen in der Nähe von Spielern (trenne " "Namen durch Leerzeichen)" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "Ersetze Besitzer der Störschützer mit neuem Besitzer" #: admin.lua msgid " " msgstr " " #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "Ersetze Besitzer der Störschützer von '@1' mit '@2'" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "Zeige geschützte Bereiche der Störschützer in der Nähe" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Störschutznamen zum Entfernen: @1" #: admin.lua msgid "Name List Reset" msgstr "Namensliste zurückgesetzt" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Geschützte Holztür" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Geschützte Stahltür" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Geschützte Falltür" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Geschützte Stahlfalltür" #: doors_chest.lua msgid "Protected Chest" msgstr "Geschützte Truhe" #: doors_chest.lua msgid "To Chest" msgstr "Zur Truhe" #: doors_chest.lua msgid "To Inventory" msgstr "Zum Inventar" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Geschützte Truhe (@1)" #: init.lua msgid "-- Protector interface --" msgstr "-- Störschutz-Interface --" #: init.lua msgid "PUNCH node to show protected area" msgstr "SCHLAGE Node, um geschützten Bereich anzuzeigen oder" #: init.lua msgid "USE for area check" msgstr "BENUTZE für Bereichsprüfung" #: init.lua msgid "Members:" msgstr "Mitglieder:" #: init.lua msgid "Close" msgstr "Schließen" #: init.lua msgid "Protection located at: @1" msgstr "Störschutz befindet sich bei: @1" #: init.lua msgid "Members: @1." msgstr "Mitglieder: @1." #: init.lua msgid "This area is not protected." msgstr "Dieser Bereich ist nicht geschützt." #: init.lua msgid "You can build here." msgstr "Du kannst hier bauen." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "Überlappung im geschützen Bereich eines Spielers" #: init.lua msgid "Protection Block" msgstr "Störschutzblock" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Störschutz (gehört @1)" #: init.lua msgid "Protection Logo" msgstr "Störschutzlogo" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Protector Redo geladen" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "Spawn @1 ist geschützt mit einem Radius von @2 Blöcke." #: init.lua msgid "This area is owned by @1" msgstr "Dieser Bereich gehört @1" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "on_punchplayer wurde durch \"nil objects\" aufgerufen" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "pvp_protect ist nicht aktiv, aktualisiere deine Minetestversion" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "pvp_protect ist ausgeschaltet" #: hud.lua msgid "Owner: @1" msgstr "Besitzer: @1" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" "Störschutz Platzier-Werkzeug (stehe neben Störschutz, schaue in die " "gewünschte Richtung und anwenden)" #: tool.lua msgid "Protector already in place!" msgstr "Störschutz is bereits platziert!" #: tool.lua msgid "No protectors available to place!" msgstr "Keine Störschützer mehr im Inventar!" #: tool.lua msgid "Protector placed at @1" msgstr "Störschutz befindet sich bei: @1" protector/locale/es.po000066400000000000000000000104141411216315300153020ustar00rootroot00000000000000# Spanish translation for PROTECTOR MOD. # Copyright (C) 2018 universales # This file is distributed under the same license as the PROTECTOR MOD package. #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: 2020-02-27\n" "Last-Translator: Universales\n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Eliminar protectores alrededor de los jugadores (nombres separados con espacios)" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "Reemplace el propietario del protector con el nombre proporcionado" #: admin.lua msgid " " msgstr " " #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "Reemplazando el nombre del protector '@1' a '@2'" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "Mostrar áreas protegidas de sus protectores cercanos" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Nombres de protectores para eliminar: @1" #: admin.lua msgid "Name List Reset" msgstr "Restablecer lista de nombres" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Puerta de madera protegida" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Puerta de hierro protegida" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Trampilla Protegida" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Trampilla de hierro protegida" #: doors_chest.lua msgid "Protected Chest" msgstr "Cofre protegido" #: doors_chest.lua msgid "To Chest" msgstr "Al cofre" #: doors_chest.lua msgid "To Inventory" msgstr "Al inventario" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Cofre protegido (@1)" #: init.lua msgid "-- Protector interface --" msgstr "-- Interfaz del protector --" #: init.lua msgid "PUNCH node to show protected area" msgstr "nodo de perforación para mostrar el área protegida" #: init.lua msgid "USE for area check" msgstr "Usar para chequeo del área" #: init.lua msgid "Members:" msgstr "Miembros:" #: init.lua msgid "Close" msgstr "Cerrar" #: init.lua msgid "Protection located at: @1" msgstr "Protección ubicada en: @1" #: init.lua msgid "Members: @1." msgstr "Miembros: @1." #: init.lua msgid "This area is not protected." msgstr "Esta área no está protegida." #: init.lua msgid "You can build here." msgstr "Puedes construir aquí." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "Se superpone en el área protegida de los jugadores anteriores" #: init.lua msgid "Protection Block" msgstr "Bloque de protección" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Protegido (Propiedad de @1)" #: init.lua msgid "Protection Logo" msgstr "Logotipo de la protección" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Protector recargado" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "Spawn @1 ha sido protegido hasta un radio de bloque @2." #: init.lua msgid "This area is owned by @1" msgstr "Esta área es propiedad de @1" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "[Protector] on_punchplayer llamado con objetos nulos." #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "[Protector] pvp_protect no está activo, actualiza tu versión de Minetest" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "[Protector] pvp_protect está deshabilitado" #: hud.lua msgid "Owner: @1" msgstr "Propietario: @1" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" "Herramienta de colocación del protector (pararse cerca del protector, dirección de la cara y uso) " #: tool.lua msgid "Protector already in place!" msgstr "¡El protector ya está en este lugar!" #: tool.lua msgid "No protectors available to place!" msgstr "¡No hay protectores disponibles para colocar!" #: tool.lua msgid "Protector placed at @1" msgstr "Protector colocado en @1" protector/locale/fr.po000066400000000000000000000075151411216315300153120ustar00rootroot00000000000000# French translation for PROTECTOR MOD. # Copyright (C) 2018 TenPlus1 # This file is distributed under the same license as the PROTECTOR MOD package. # Doloment, 2017. # CodeXP , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Last-Translator: CodeXP \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Retirer les protecteurs près des joueurs avec les noms fournis (noms séparés " "avec des espaces)" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "" #: admin.lua msgid " " msgstr "" #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Noms de protecteurs à supprimer: @1" #: admin.lua msgid "Name List Reset" msgstr "Liste de noms réinitialiser" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Porte en bois protégée" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Porte en acier protégée" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Trappe protégé" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Trap en acier protégé" #: doors_chest.lua msgid "Protected Chest" msgstr "Coffre protégé" #: doors_chest.lua msgid "To Chest" msgstr "Vers le coffre" #: doors_chest.lua msgid "To Inventory" msgstr "Vers l'inventaire" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Coffre protégé (@1)" #: init.lua msgid "-- Protector interface --" msgstr "-- Interface Protector --" #: init.lua msgid "PUNCH node to show protected area" msgstr "TAPÉ le bloc pour afficher la zone protégée" #: init.lua msgid "USE for area check" msgstr "UTILISER pour vérifier la zone" #: init.lua msgid "Members:" msgstr "Membres:" #: init.lua msgid "Close" msgstr "Fermer" #: init.lua msgid "Protection located at: @1" msgstr "Protection située à: @1" #: init.lua msgid "Members: @1." msgstr "Membres: @1." #: init.lua msgid "This area is not protected." msgstr "Cette zone n'est pas protégée." #: init.lua msgid "You can build here." msgstr "Vous pouvez construire ici." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "Vous chevauché une zone protégé." #: init.lua msgid "Protection Block" msgstr "Bloc de protection" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Protection (détenue par @1)" #: init.lua msgid "Protection Logo" msgstr "Logo de protection" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Protector Redo chargé" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "" #: init.lua #, fuzzy msgid "This area is owned by @1" msgstr "Cette zone appartient à @1!" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "[Protector] on_punchplayer appelé avec des objets nil" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "" "[Protector] pvp_protect est désactivé, mettez à jour votre version de " "Minetest" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "[Protector] pvp_protect est désactivé" #: hud.lua msgid "Owner: @1" msgstr "" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" #: tool.lua msgid "Protector already in place!" msgstr "" #: tool.lua msgid "No protectors available to place!" msgstr "" #: tool.lua msgid "Protector placed at @1" msgstr "Protection située à: @1" protector/locale/it.po000066400000000000000000000104771411216315300153200ustar00rootroot00000000000000# Italian translation for PROTECTOR MOD. # Copyright (C) 2020 Hamlet # This file is distributed under the same license as the PROTECTOR MOD package. # Xanthin , 2016. # CodeXP , 2018. # msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.1\n" "Last-Translator: Hamlet \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: it\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Elimina i protettori attorno ai giocatori (separa i nomi con gli spazi)" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "Sostituisci il proprietario del protettore col nome fornito" #: admin.lua msgid " " msgstr " " #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "Sostituzione del nome del protettore '@1' con '@2'" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "Mostra le aree protette dei protettori vicino a te" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Nomi dei protettori da eliminare: @1" #: admin.lua msgid "Name List Reset" msgstr "Azzera l'elenco dei nomi" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Porta di legno protetta" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Porta d'acciaio protetta" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Botola protetta" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Botola d'acciaio protetta" #: doors_chest.lua msgid "Protected Chest" msgstr "Baule protetto" #: doors_chest.lua msgid "To Chest" msgstr "Al baule" #: doors_chest.lua msgid "To Inventory" msgstr "All'inventario" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Baule protetto (@1)" #: init.lua msgid "-- Protector interface --" msgstr "-- Interfaccia protettore --" #: init.lua msgid "PUNCH node to show protected area" msgstr "COLPISCI il nodo per mostrare l'area protetta" #: init.lua msgid "USE for area check" msgstr "USA per controllare l'area" #: init.lua msgid "Members:" msgstr "Membri:" #: init.lua msgid "Close" msgstr "Chiudi" #: init.lua msgid "Protection located at: @1" msgstr "Protezione collocata a: @1" #: init.lua msgid "Members: @1." msgstr "Membri: @1." #: init.lua msgid "This area is not protected." msgstr "Quest'area non è protetta." #: init.lua msgid "You can build here." msgstr "Qui puoi costruire." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "Si sovrappone ad un'area sovrastante protetta dai giocatori" #: init.lua msgid "Protection Block" msgstr "Blocco di protezione" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Protezione (di proprietà di @1)" #: init.lua msgid "Protection Logo" msgstr "Logo di protezione" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Protector Redo caricato" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "Lo spawn @1 è stato protetto fino a un raggio di @2 blocchi." #: init.lua msgid "This area is owned by @1" msgstr "Quest'area è di proprietà di @1" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "[Protector] on_punchplayer chiamato con oggetti nil" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "[Protector] pvp_protect non attiva, aggiorna la tua versione di Minetest" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "[Protector] pvp_protect è disattivato" #: hud.lua msgid "Owner: @1" msgstr "Proprietario: @1" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "Strumento di posizionamento protettore (stai vicino al protettore, guarda la direzione e usa)" #: tool.lua msgid "Protector already in place!" msgstr "Protettore già presente!" #: tool.lua msgid "No protectors available to place!" msgstr "Nessun protettore disponibile da posizionare!" #: tool.lua msgid "Protector placed at @1" msgstr "Protettore posizionato a @1"protector/locale/protector.de.tr000066400000000000000000000052601411216315300173150ustar00rootroot00000000000000# textdomain: protector # author: Xanthin and CodeXP # last update: 2020/Jul/12 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Entferne Störschützer von bestimmten Namen in der Nähe von Spielern (trenne Namen durch Leerzeichen) = Replace Protector Owner with name provided=Ersetze Besitzer der Störschützer mit neuem Besitzer = Replacing Protector name '@1' with '@2'=Ersetze Besitzer der Störschützer von '@1' mit '@2' Show protected areas of your nearby protectors=Zeige geschützte Bereiche der Störschützer in der Nähe Protector Names to remove: @1=Störschutznamen zum Entfernen: @1 Name List Reset=Namensliste zurückgesetzt ### 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 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 Protection located at: @1=Störschutz befindet sich bei: @1 Members: @1.=Mitglieder: @1. This area is not protected.=Dieser Bereich ist nicht geschützt. You can build here.=Du kannst hier bauen. Overlaps into above players protected area=Überlappung im geschützen 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 Spawn @1 has been protected up to a @2 block radius.=Spawn @1 ist geschützt mit einem Radius von @2 Blöcke. This area is owned by @1=Dieser Bereich gehört @1 ### 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 ### hud.lua ### Owner: @1=Besitzer: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Störschutz Platzier-Werkzeug (stehe neben Störschutz, schaue in die gewünschte Richtung und anwenden) Protector already in place!=Störschutz is bereits platziert! No protectors available to place!=Keine Störschützer mehr im Inventar! "Protector placed at @1"=Störschutz befindet sich bei: @1 protector/locale/protector.es.tr000066400000000000000000000053111411216315300173310ustar00rootroot00000000000000# textdomain: protector # author: universales # last update: 2020-02-27 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Eliminar protectores alrededor de los jugadores (nombres separados con espacios) = Replace Protector Owner with name provided=Reemplace el propietario del protector con el nombre proporcionado = Replacing Protector name '@1' with '@2'=Reemplazando el nombre del protector '@1' a '@2' Show protected areas of your nearby protectors=Mostrar áreas protegidas de sus protectores cercanos Protector Names to remove: @1=Nombres de protectores para eliminar: @1 Name List Reset=Restablecer lista de nombres ### doors_chest.lua ### Protected Wooden Door=Puerta de madera protegida Protected Steel Door=Puerta de hierro protegida Protected Trapdoor=Trampilla Protegida Protected Steel Trapdoor=Trampilla de hierro protegida Protected Chest=Cofre protegido To Chest=Al cofre To Inventory=Al inventario Protected Chest (@1)=Cofre protegido (@1) ### init.lua ### -- Protector interface --=-- Interfaz del protector -- PUNCH node to show protected area=nodo de perforación para mostrar el área protegida USE for area check=Usar para chequeo del área Members:=Miembros: Close=Cerrar Protection located at: @1=Protección ubicada en: @1 Members: @1.=Miembros: @1. This area is not protected.=Esta área no está protegida. You can build here.=Puedes construir aquí. Overlaps into above players protected area=Se superpone en el área protegida de los jugadores anteriores Protection Block=Bloque de protección Protection (owned by @1)=Protegido (Propiedad de @1) Protection Logo=Logotipo de la protección [MOD] Protector Redo loaded=[MOD] Protector recargado Spawn @1 has been protected up to a @2 block radius.=Spawn @1 ha sido protegido hasta un radio de bloque @2. This area is owned by @1=Esta área es propiedad de @1 ### pvp.lua ### [Protector] on_punchplayer called with nil objects=[Protector] on_punchplayer llamado con objetos nulos. [Protector] pvp_protect not active, update your version of Minetest=[Protector] pvp_protect no está activo, actualiza tu versión de Minetest [Protector] pvp_protect is disabled=[Protector] pvp_protect está deshabilitado ### hud.lua ### Owner: @1=Propietario: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Herramienta de colocación del protector (pararse cerca del protector, dirección de la cara y uso) Protector already in place!=¡El protector ya está en este lugar! No protectors available to place!=¡No hay protectores disponibles para colocar! Protector placed at @1=Protector colocado en @1 protector/locale/protector.fr.tr000066400000000000000000000051001411216315300173250ustar00rootroot00000000000000# textdomain: protector # author: CodeXP and TenPlus1 # last update: 2020/Jul/12 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Retirer les protecteurs près des joueurs avec les noms fournis (noms séparés avec des espaces) = Replace Protector Owner with name provided=Remplacer le propriétaire du protecteur par le nom fourni = Replacing Protector name '@1' with '@2'= Show protected areas of your nearby protectors=Affichez les zones protégées de vos protecteurs à proximité Protector Names to remove: @1=Noms de protecteurs à supprimer: @1 Name List Reset=Liste de noms réinitialiser ### doors_chest.lua ### Protected Wooden Door=Porte en bois protégée Protected Steel Door=Porte en acier protégée Protected Trapdoor=Trappe protégé Protected Steel Trapdoor=Trap en acier protégé Protected Chest=Coffre protégé To Chest=Vers le coffre To Inventory=Vers l'inventaire Protected Chest (@1)=Coffre protégé (@1) ### init.lua ### -- Protector interface --=-- Interface Protector -- PUNCH node to show protected area=TAPÉ le bloc pour afficher la zone protégée USE for area check=UTILISER pour vérifier la zone Members:=Membres: Close=Fermer Protection located at: @1=Protection située à: @1 Members: @1.=Membres: @1. This area is not protected.=msgstr "Cette zone n'est pas protégée. You can build here.=Vous pouvez construire ici. Overlaps into above players protected area=Vous chevauché une zone protégé. Protection Block=Bloc de protection Protection (owned by @1)=Protection (détenue par @1) Protection Logo=Logo de protection [MOD] Protector Redo loaded=[MOD] Protector Redo chargé Spawn @1 has been protected up to a @2 block radius.= This area is owned by @1=Cette zone appartient à @1! ### pvp.lua ### [Protector] on_punchplayer called with nil objects=[Protector] on_punchplayer appelé avec des objets nil [Protector] pvp_protect not active, update your version of Minetest=[Protector] pvp_protect est désactivé, mettez à jour votre version de Minetest [Protector] pvp_protect is disabled=[Protector] pvp_protect est désactivé ### hud.lua ### Owner: @1=Propriétaire: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Outil de placement du protecteur (se tenir près du protecteur, direction du visage et utilisation) Protector already in place!=Protecteur déjà en place! No protectors available to place!=Aucun protecteur disponible à placer! Protector placed at @1=Protection située à: @1 protector/locale/protector.it.tr000066400000000000000000000051671411216315300173470ustar00rootroot00000000000000# textdomain: protector # author: Xanthin and CodeXP # last update: 2018/Jul/10 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Elimina i protettori attorno ai giocatori (separa i nomi con gli spazi) = Replace Protector Owner with name provided=Sostituisci il proprietario del protettore col nome fornito = Replacing Protector name '@1' with '@2'=Sostituzione del nome del protettore '@1' con '@2' Show protected areas of your nearby protectors=Mostra le aree protette dei protettori vicino a te Protector Names to remove: @1=Nomi dei protettori da eliminare: @1 Name List Reset=Azzera l'elenco dei nomi ### doors_chest.lua ### Protected Wooden Door=Porta di legno protetta Protected Steel Door=Porta d'acciaio protetta Protected Trapdoor=Botola protetta Protected Steel Trapdoor=Botola d'acciaio protetta Protected Chest=Baule protetto To Chest=Al baule To Inventory=All'inventario Protected Chest (@1)=Baule protetto (@1) ### init.lua ### -- Protector interface --=-- Interfaccia protettore -- PUNCH node to show protected area=COLPISCI il nodo per mostrare l'area protetta USE for area check=USA per controllare l'area Members:=Membri: Close=Chiudi Protection located at: @1=Protezione collocata a: @1 Members: @1.=Membri: @1. This area is not protected.=Quest'area non è protetta. You can build here.=Qui puoi costruire. Overlaps into above players protected area=Si sovrappone ad un'area sovrastante protetta dai giocatori Protection Block=Blocco di protezione Protection (owned by @1)=Protezione (di proprietà di @1) Protection Logo=Logo di protezione [MOD] Protector Redo loaded=[MOD] Protector Redo caricato Spawn @1 has been protected up to a @2 block radius.=Lo spawn @1 è stato protetto fino a un raggio di @2 blocchi. This area is owned by @1=Quest'area è di proprietà di @1 ### pvp.lua ### [Protector] on_punchplayer called with nil objects=[Protector] on_punchplayer chiamato con oggetti nil [Protector] pvp_protect not active, update your version of Minetest=[Protector] pvp_protect non attiva, aggiorna la tua versione di Minetest [Protector] pvp_protect is disabled=[Protector] pvp_protect è disattivato ### hud.lua ### Owner: @1=Proprietario: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Strumento di posizionamento protettore (stai vicino al protettore, guarda la direzione e usa) Protector already in place!=Protettore già presente! No protectors available to place!=Nessun protettore disponibile da posizionare! Protector placed at @1=Protettore posizionato a @1 protector/locale/protector.ru.tr000066400000000000000000000070221411216315300173510ustar00rootroot00000000000000# textdomain: protector # author: CodeXP # last update: 2018/Jul/10 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Удалить защиту рядом с игроками (перечислить имена, разделяя пробелами) =<список имён> Replace Protector Owner with name provided=Заменить владельца защиты новым владельцем =<имя владельца> <имя нового владельца> Replacing Protector name '@1' with '@2'=Заменяется владелец защиты с '@1' на '@2' Show protected areas of your nearby protectors=Показать ближайшие защищённые территории Protector Names to remove: @1=Имена, подлежащие удалению: @1 Name List Reset=Очистить список имён ### doors_chest.lua ### Protected Wooden Door=Защищённая яблоневая дверь Protected Steel Door=Защищённая стальная дверь Protected Trapdoor=Защищённый яблоневый люк Protected Steel Trapdoor=Защищённый стальной люк Protected Chest=Защищённый сундук To Chest=В сундук To Inventory=В инвентрарь Protected Chest (@1)=Защищённый сундук (@1) ### init.lua ### -- Protector interface --=-- Настройка защиты -- PUNCH node to show protected area=СТУКНУТЬ узел для подсветки защищённой территории USE for area check=ЛКМ для проверки защищённой территории Members:=Участники: Close=Закрыть Protection located at: @1=Защита находится на координатах @1 Members: @1.=Участники: @1. This area is not protected.=Территория свободна. You can build here.=Здесь можно ставить блоки. Overlaps into above players protected area=Защитный блок не может быть установлен: пересечение с областями, защищёнными другими игроками Protection Block=Защитный блок Protection (owned by @1)=Защита игрока @1 Protection Logo=Защитный знак [MOD] Protector Redo loaded=[МОД] Protector Redo загружен Spawn @1 has been protected up to a @2 block radius.=Спаун @1 защищён в радиусе @2 блока. This area is owned by @1=Эта территория пренадлежит @1 ### pvp.lua ### [Protector] on_punchplayer called with nil objects=[Защита] on_punchplayer вызвана с нулевыми объектами [Protector] pvp_protect not active, update your version of Minetest=[Защита] pvp_protect неактивен, обновите версию Minetest [Protector] pvp_protect is disabled=[Защита] pvp_protect отключён ### hud.lua ### Owner: @1=Владелец: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Инструмент установки защиты (встаньте рядом с защитой, повернитесь в нужном направлении и используйте) Protector already in place!=Защита уже установлена! No protectors available to place!=У вас нет защитных блоков в инвентаре! Protector placed at @1=Защита находится на координатах @1 protector/locale/protector.tr.tr000066400000000000000000000050541411216315300173530ustar00rootroot00000000000000# textdomain: protector # author: CodeXP and TenPlus1 # last update: 2020/Jul/12 ### admin.lua ### Remove Protectors around players (separate names with spaces)=Ismi verilen oyuncuların yanındaki korumaları kaldır. (İsimleri boşlukla ayır) = Replace Protector Owner with name provided=Koruyucu Sahibini belirtilen adla değiştirin = Replacing Protector name '@1' with '@2'='@ 1' Koruyucu adını '@ 2' ile değiştirin Show protected areas of your nearby protectors=Yakındaki koruyucuların korunan alanlarını göster 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 To Chest=Sandığa To Inventory=Envantere Protected Chest (@1)=Korumalı sandık (@1) ### init.lua ### -- Protector interface --=-- Koruyucu arayüz -- 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 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=Yukarıdaki oyuncuların koruma alanı ile çakışıyor Protection Block=Koruma kutusu Protection (owned by @1)=Koruma (@1 sahibidir) Protection Logo=Koruma arması [MOD] Protector Redo loaded=[MOD] Protector Redo yüklendi Spawn @1 has been protected up to a @2 block radius.=Spawn @1, @2 blok yarıçapa kadar korunur. This area is owned by @1=Burasının sahibi @1! ### 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ı. ### hud.lua ### Owner: @1=Sahip: @1 ### tool.lua ### Protector Placer Tool (stand near protector, face direction and use)=Koruyucu Yerleştirme Aleti (koruyucunun yanında durun, yüz yönü ve kullanım) Protector already in place!=Koruyucu zaten yerinde! No protectors available to place!=Yerleştirilecek koruyucu yok! Protector placed at @1=Korumanın bulunduğu yer @1 protector/locale/ru.po000066400000000000000000000123301411216315300153200ustar00rootroot00000000000000# Russian translation for PROTECTOR MOD. # Copyright (C) 2018 TenPlus1 # This file is distributed under the same license as the PROTECTOR MOD package. # Doloment, 2017. # CodeXP , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Last-Translator: CodeXP \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Удалить защиту рядом с игроками (перечислить имена, разделяя пробелами)" #: admin.lua msgid "" msgstr "<список имён>" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "Заменить владельца защиты новым владельцем" #: admin.lua msgid " " msgstr "<имя владельца> <имя нового владельца>" #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "Заменяется владелец защиты с '@1' на '@2'" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "Показать защищенные территории с ближней защитой" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Имена защит, подлежащих удалению: @1" #: admin.lua msgid "Name List Reset" msgstr "Сброс списка имен" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Защищенная яблоневая дверь" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Защищенная стальная дверь" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Защищенный яблоневый люк" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Защищенный стальной люк" #: doors_chest.lua msgid "Protected Chest" msgstr "Защищенный сундук" #: doors_chest.lua msgid "To Chest" msgstr "В сундук" #: doors_chest.lua msgid "To Inventory" msgstr "В инвентрарь" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Защищенный сундук (@1)" #: init.lua msgid "-- Protector interface --" msgstr "-- Настройка защиты --" #: init.lua msgid "PUNCH node to show protected area" msgstr "СТУКНУТЬ узел для подсведки защищенной территории" #: init.lua msgid "USE for area check" msgstr "ЛКМ для проверки защищенной территории" #: init.lua msgid "Members:" msgstr "Участники:" #: init.lua msgid "Close" msgstr "Закрыть" #: init.lua msgid "Protection located at: @1" msgstr "Защита находится на координатах @1" #: init.lua msgid "Members: @1." msgstr "Участники: @1." #: init.lua msgid "This area is not protected." msgstr "Территория свободна." #: init.lua msgid "You can build here." msgstr "Здесь можно ставить блоки." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "" "Защитный блок не может быть установлен: пересечение с областями, защищенными " "другими игроками" #: init.lua msgid "Protection Block" msgstr "Защитный блок" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Защита игрока @1" #: init.lua msgid "Protection Logo" msgstr "Защитный знак" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Модификация \"Переделанная Защита\" загружена" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "Спаун @1 защищен в радиусе @2 блока." #: init.lua msgid "This area is owned by @1" msgstr "Эта территория пренадлежит @1" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "[Защита] on_punchplayer вызвана с нулевыми объектами" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "[Защита] pvp_protect не активен, обновите версию Minetest" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "[Защита] pvp_protect отключен" #: hud.lua msgid "Owner: @1" msgstr "Владелец: @1" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" "Инструмент установки защиты (станьте рядом с защитой, повернитесь в нужное " "направление и используйте)" #: tool.lua msgid "Protector already in place!" msgstr "Защита уже установлена!" #: tool.lua msgid "No protectors available to place!" msgstr "У вас нет защитных блоков в инвентаре!" #: tool.lua msgid "Protector placed at @1" msgstr "Защита находится на координатах @1" protector/locale/template.pot000066400000000000000000000057171411216315300167040ustar00rootroot00000000000000# Template for PROTECTOR MOD. # Copyright (C) 2018 TenPlus1 # This file is distributed under the same license as the PROTECTOR MOD package. # Xanthin , 2016. # CodeXP , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Last-Translator: CodeXP \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "" #: admin.lua msgid " " msgstr "" #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "" #: admin.lua msgid "Protector Names to remove: @1" msgstr "" #: admin.lua msgid "Name List Reset" msgstr "" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "" #: doors_chest.lua msgid "Protected Steel Door" msgstr "" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "" #: doors_chest.lua msgid "Protected Chest" msgstr "" #: doors_chest.lua msgid "To Chest" msgstr "" #: doors_chest.lua msgid "To Inventory" msgstr "" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "" #: init.lua msgid "-- Protector interface --" msgstr "" #: init.lua msgid "PUNCH node to show protected area" msgstr "" #: init.lua msgid "USE for area check" msgstr "" #: init.lua msgid "Members:" msgstr "" #: init.lua msgid "Close" msgstr "" #: init.lua msgid "Protection located at: @1" msgstr "" #: init.lua msgid "Members: @1." msgstr "" #: init.lua msgid "This area is not protected." msgstr "" #: init.lua msgid "You can build here." msgstr "" #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "" #: init.lua msgid "Protection Block" msgstr "" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "" #: init.lua msgid "Protection Logo" msgstr "" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "" #: init.lua msgid "This area is owned by @1" msgstr "" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "" #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "" #: hud.lua msgid "Owner: @1" msgstr "" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" #: tool.lua msgid "Protector already in place!" msgstr "" #: tool.lua msgid "No protectors available to place!" msgstr "" #: tool.lua msgid "Protector placed at @1" msgstr "" protector/locale/tr.po000066400000000000000000000073241411216315300153260ustar00rootroot00000000000000# Turkish translation for PROTECTOR MOD. # Copyright (C) 2018 TenPlus1 # This file is distributed under the same license as the PROTECTOR MOD package. # mahmutelmas06, 2016. # CodeXP , 2018. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROTECTOR MOD\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-07-10 17:33+0200\n" "PO-Revision-Date: \n" "Last-Translator: CodeXP \n" "Language-Team: \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.lua msgid "Remove Protectors around players (separate names with spaces)" msgstr "Ismi verilen oyuncuların yanındaki korumaları kaldır. (İsimleri boşlukla " "ayır)" #: admin.lua msgid "" msgstr "" #: admin.lua msgid "Replace Protector Owner with name provided" msgstr "" #: admin.lua msgid " " msgstr "" #: admin.lua msgid "Replacing Protector name '@1' with '@2'" msgstr "" #: admin.lua msgid "Show protected areas of your nearby protectors" msgstr "" #: admin.lua msgid "Protector Names to remove: @1" msgstr "Silinecek korumaların isimleri: @1" #: admin.lua msgid "Name List Reset" msgstr "İsim listesini sıfırla" #: doors_chest.lua msgid "Protected Wooden Door" msgstr "Korumalı ahşap kapı" #: doors_chest.lua msgid "Protected Steel Door" msgstr "Korumalı çelik kapı" #: doors_chest.lua msgid "Protected Trapdoor" msgstr "Korumalı tuzak kapısı" #: doors_chest.lua msgid "Protected Steel Trapdoor" msgstr "Korumalı çelik tuzak kapısı" #: doors_chest.lua msgid "Protected Chest" msgstr "Korumalı sandık" #: doors_chest.lua msgid "To Chest" msgstr "Sandığa" #: doors_chest.lua msgid "To Inventory" msgstr "Envantere" #: doors_chest.lua msgid "Protected Chest (@1)" msgstr "Korumalı sandık (@1)" #: init.lua msgid "-- Protector interface --" msgstr "" #: init.lua msgid "PUNCH node to show protected area" msgstr "Korunan alanı göstermek için yumruk" #: init.lua msgid "USE for area check" msgstr "Bölge kontrolü için kullan" #: init.lua msgid "Members:" msgstr "Üyeler" #: init.lua msgid "Close" msgstr "Kapat" #: init.lua msgid "Protection located at: @1" msgstr "Korumanın bulunduğu yer @1" #: init.lua msgid "Members: @1." msgstr "Üyeler @1." #: init.lua msgid "This area is not protected." msgstr "Bu alan korumalı değildir." #: init.lua msgid "You can build here." msgstr "Buraya inşaa edebilirsiniz." #: init.lua tool.lua msgid "Overlaps into above players protected area" msgstr "" #: init.lua msgid "Protection Block" msgstr "Koruma kutusu" #: admin.lua init.lua tool.lua msgid "Protection (owned by @1)" msgstr "Koruma (@1 sahibidir)" #: init.lua msgid "Protection Logo" msgstr "Koruma arması" #: init.lua msgid "[MOD] Protector Redo loaded" msgstr "[MOD] Protector Redo yüklendi" #: init.lua msgid "Spawn @1 has been protected up to a @2 block radius." msgstr "" #: init.lua msgid "This area is owned by @1" msgstr "Burasının sahibi @1!" #: pvp.lua msgid "[Protector] on_punchplayer called with nil objects" msgstr "[Protector] on_punchplayer boş objelerle çağrıldı" #: pvp.lua msgid "[Protector] pvp_protect not active, update your version of Minetest" msgstr "[Protector] pvp_protect aktif değil, Minetest sürümünüzü güncelleyin." #: pvp.lua msgid "[Protector] pvp_protect is disabled" msgstr "[Protector] pvp_protect kapatıldı." #: hud.lua msgid "Owner: @1" msgstr "" #: tool.lua msgid "Protector Placer Tool (stand near protector, face direction and use)" msgstr "" #: tool.lua msgid "Protector already in place!" msgstr "" #: tool.lua msgid "No protectors available to place!" msgstr "" #: tool.lua msgid "Protector placed at @1" msgstr "Korumanın bulunduğu yer @1" protector/lucky_block.lua000066400000000000000000000006651411216315300161070ustar00rootroot00000000000000 -- 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 protector/mod.conf000066400000000000000000000003021411216315300145150ustar00rootroot00000000000000name = protector description = Lets players craft special blocks to protect their builds or disable PVP in areas. optional_depends = default, intllib, lucky_block, mesecons_mvps, playerfactions protector/pvp.lua000066400000000000000000000034231411216315300144060ustar00rootroot00000000000000 local S = protector.intllib -- get static spawn position local statspawn = minetest.string_to_pos(minetest.settings:get("static_spawnpoint")) or {x = 0, y = 2, z = 0} -- is spawn protected local protector_spawn = tonumber(minetest.settings:get("protector_spawn") or minetest.settings:get("protector_pvp_spawn")) or 0 -- is night-only pvp enabled local 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 minetest.settings:get_bool("protector_pvp") then if minetest.register_on_punchplayer then 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") end if not hitter:is_player() then return false end -- no pvp at spawn area local pos = player:get_pos() if pos.x < statspawn.x + protector_spawn and pos.x > statspawn.x - protector_spawn and pos.y < statspawn.y + protector_spawn and pos.y > statspawn.y - protector_spawn and pos.z < statspawn.z + protector_spawn and pos.z > statspawn.z - protector_spawn 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 end return false end) else print("[Protector] pvp_protect not active, update your version of Minetest") end else print("[Protector] pvp_protect is disabled") end protector/screenshot.png000066400000000000000000000276051411216315300157710ustar00rootroot00000000000000PNG  IHDRI/S`PLTE -5(&31VH,316A0C2U@.^BHEHHGP?R,&bx+  D+BNRϤp Ah]*%7NQ2׬6% 4(X57V%l aMئMX ƅ}N4wMِfY'1|c\Jh ~Ǣ* #D:N"6EY@i )Ѧ(f!Vi~0e|c&u!X,8WڑYJ`e8 )D z[CFLaA oAB $2 % W!/*d ,H_4BPp·nv|e*l&tBMQK*Riá (#S؞KU<+ý v*:d w⯓%-Nk G4$R00y;ï_&4yhӜ 4YaX\e_?"i_$GU&K) ɏwrJ b@@YWLCPLEvJj(*r F`Ai2t7,}@BB^?B?Nz4xÛۥϥ|Be-0̶S8ubufZijZLFJ^+CI T繰MJ^+*fJĕl޹*[ζNn95XIK:4ָ ll2CX'S4܂I`_gҬ3ckD5^O3~p%^ڱFOVڔ.(pV,p#0&G"JBZK+KvHDC?0;G l6Jxh3_-8.< }mQ ?s U#%)Y"&SHS!<#83+/\fG N'ujLcY<s!$Ex-]M-X56k*7*,CUeNXё<J'zki[ѪuCq $L2\]B=P.DT Ʃa%oV!|]p.PY[o4F@(oQg?QX&v qCX)QC]’}V"> ϕVW萿Z- vpoa ^hGq^g={|0(rBL+4T#xМ-$7B$܄?"2ݠ1Wh@p?GwR}C#Bvjhx"Υ2չP "^zZ=o'kryb3NP(2%rU6:!MC?H{D& 2܌-/{ۅǒ츕U\># MEVm1|1|o&&zA*x2l7S]\UͬHAj\E+( eZ}%JH !wZJ.g@UQͅA4;JQ"˜͢"z/aі[: *Fʒbu7/!D!a )N ʋ9!DaN("hd6vue8rujt;br{D̾\ݩ"^;t~>C_x~ B32@H6?:XS.S iAWU (&x4 d' RƵR(:р_d $<#+ir*ҵ3ZvBZ$F |T' [;_$Ry6C2A:|2Xml㧧%$nfݧ%ĈP( 6EJ&xYd:]d: U!mbޗ9"׽V41 /\#-~y-m nkBLVzPB84xd6eN1B- NrBl#D"sDɫ;[szD ;^{Ӏa OSW>ygJ.Z"唍^DؾNz!N}fIaVT&F Q!_E){CꞂQ%*՝ ,N|6jE\Փc'iG%DGN T"Zb t:!0Z9a&E8"q -^3mަ]Ǵ#P)\*!MIe]'(auAD44HFzmMXcǐ" Pm@nGIbD!T -`E&uhMk@x\GF }|ra`١ʋè0[ P-L0D-!bj }Ǚ]})fk0NW(O!mFZf@bL4]#QH85{Z- {[[/=BZR\M(ݷJoNLfYOٜn虝\àC&n4fTڻ6#>\̆{#gݙr 0 d ́mnOVl&t 5g3#dGB jP̦M"9靡۫ۼ8Wf:G1BKG>?=ft6,TOJbE߇sB)^!]=WAޞ$?'EY hgH:@B5 "'$t`ɲ[,-f{vgaDRfȇ60K`c_0 $CZ^%GyG#Bm 5~}v!r|S'ܢ@NSd$b͉(:t2 E7A Z@䞯-p CSd\T+ uk S`@%_Q?}$?&|\ 6vx\8~WZ))=X^ꔐD4^MC.<ĺ1C@hl8L 4J(d')Ͱ&,Mg9'8)v'zplc䲱79$s@^CSD@VYY-9f\I@LՄNQJ Yh@oA޴v#[R*c840eplw bzG8)ڴ4?)$ꞬC$)  g&݇C?.Ruo1}TA|VE[ᗴ2dUPaIܴk*03pNyqMhMr4Y.wQ ]SQP2Cg9EPt)(*  < kt"WcZ:V+M, e.fYA< nȵK3rꙨ7rHyߥZkHƆtFus#q*24YzYu^UE[y;DĢx; 64rW,zPސ%J( wTR"ʂW}3vز!] IQ߳_.7/04۬bmRe\HȲr<;i61HD]Y>D"< UgYg3$DQ@.I6 Zyk$$@.C̛A$LXA/}&M+WXEL 7&w! bTWO o4d32.*sQB@OĨ da%} .yNa1\PN;̚rx/ _hs+S24mrwQ GTd/ ({1fK!rvOўȼ(LDY@Zv-֍}Z|ÍIs_g.ltrd5@tUt&4aI8MF }ȓE=l }3;8gq 1}'qdi'x! @ԭ)~^-"@;1 g@ v\ q0uEXQ͓mKBI%7ƞof 5}Txq$1%c"hb'eW3K^OM!NjLJWu 7xo$p@SK@A3B1ZVgXMr~2N𮩾@տ00 i:@Ծ~ba O)Ëi9WOgƨH/ Y, MuLDqA^W@Άd Lh w0]~>FEA@Iq Hȟ@$#!i5$L g:/n HDy@Cb~ܘOΝG'gQݴe'B)!؈ETVJ#KZ@!V%i'ˁRBj5:9b@+E5'0kR9*i@@?@UŪiry&LyU\һn,b+tdUdߔR xTHOY^&4$,v_"r{x)UX4 PX* s@ipm SrxIꐈ#?w .%&x^lvy+IDAT"z"Mޚ+ٗMnt}7$0dzJYXi@lV%(96jyȋP H繅~4I7"@ROEn>ƶxwyIx` c8%! ȃbb-1$DHTB\{Ȅlr ɗp _3 WAS_Bh6V$kg?Lm ع > H@x^J LBh&^kiD*'SZ^H }"Iɗ:52\ [Ti@{\ J@]TҠY'v`R@:?%KƲ;@ |?K @4Lz7g 4bӰ}}RBko//- SB>r]pكn+H9PFz 5zSp4 Du)@C\B S !^ˤ&*uK,bIH[7_t߉LoW#wiVBp놰4NXk$rbto0![Zwܙ2pĊ`y qf@Ϊh! fGm;du"^{)phh4sx5E@TO.s'e^3{ya9Afj jHյ暑ŮBB@ ]#a8>ri />5ҫy>NKl 9q %5BYbyt^7b!FpB)ھdËC.$uokBZjNlc-1Bv%_5Y*I zqs4A1%R՞HB s}:@HHC(SE)߱<:rBޱz"r:K:&4g+NȀ8hMJZ+!egCjO$ C@>QSvF@Nj9v7LtE\丶=pjO e` u#eܩ\Nu /!/ku3@~_ T "!I \t~ʂbuf1$M.+gQq_:G @.{p2.ӑ&!?Y'ñz8ew)\3tVb! f6Y~T$X.Q%ri̬@%$ΰU;`y@'7X4ZTwvNi{"*$rJ/aj"s0~̌q <-Wl>D&)$K  5$q1ZDdg-:L\.y r~A8Kdlr261^&ZZ9t<R"_ v ɺ1Z, k5DE>ā(׮J 0 | % ]nQ@'l Y8$a ŀ$a? ҫjΥ(RdnZP}>=SDB)kd_I" \YtV qmY&[a Y Dj.6!nbJ\Bnk&$ַVBVH8 uR-3y\u,&*&"#jֹd @룀a /_Bhz vkV!" ۙ/4rWəK zΜ|"TmhLy!m@.H_"sk(B4HktzR5# v } Q::5Y<ҁl|\u5a=jujF.>bv=fP@"@Ȳ%+| ۦ]+B%lA7:aAݚ ꬪޚaLW@ v76 @^ƠS_ _;OBO¯>$ELN3\&k1x5h",ˉ6+ +<򶗄,]";d9)6Q\` k 4rY ZLWۊ!+1b{1f.kC@e\^Do z!"Ŀ5yB" 7&A`ϽF FN@i3j $rYX*}H>@2']Yu&!~5a1X~O?7.u٦ ˙O2.1K╮W8&\m%^q!lue-Ym{MU:䗀O w@~H;vfe?U{K;}=mWy*S!@ƿ_Gږ0 GNzrpǾW7Wu;A5w>@Jj^?dW =N6mFŊ ϻ$濶K<֊z=K` ou?$u@5 ֘dY_.@1*/wLJv~9_";8R~?$9>}/g$\o&%ǩ?Ѕ{L%~4a"~6>e㢳/2-!LjtckOWOӄ;ȸV~ܵҿ>k/<@fg9+x`^9ƻXpyݷ1tb=#+%@ƥ??;Gj;P&+^{vv$w-FfFL_?:IWUaSpض|j*b|؍߇Sq ᅲ/oYȌ5@oY9l7j5_,Y'dK%|U#Y\PIDATmEb0,f3tB1&0\J߹b\nwU)Uƾ,&O\ B:f~(x{y>ؽ'Y&OBi[+x<X#Q5z.ߵ1Nt9i+ %IENDB`protector/textures/default_chest_side.png000066400000000000000000000005671411216315300213130ustar00rootroot00000000000000PNG  IHDR(-SPLTE?/ L[Xr;HjCǟgUzCw^7pU/ɠh^SP}c=|`9j4ŜeÚ`uMuZ3f0ͣjěcMIv?p9mT/jP*zدwҨp|Ef?nX6~W%~XnK~G_,dK%abIDATeW0 EݸAP_b1&ū/xDTy4vpNO @`S2$Cw="*qPuUI YYWr}{Uk#c(bɨvu]^,oG[m jA!6~͚ :EIENDB`protector/textures/default_chest_top.png000066400000000000000000000006421411216315300211630ustar00rootroot00000000000000PNG  IHDR(-SPLTE?/ G[LzCWq;o9ǟgOɠh^RmBr<ŜeÚ`TKw@t@g=pU,ͣjěcVIuIrDk>h3vW-zدwҨpYVSQp?{a.sIDATc`p```B0!1>_lIENDB`protector/textures/doors_grey.png000066400000000000000000000001511411216315300176360ustar00rootroot00000000000000PNG  IHDR$ PLTE~IDATc0  @00%IENDB`protector/textures/doors_steel.png000066400000000000000000000002041411216315300200030ustar00rootroot00000000000000PNG  IHDRb PLTE[}tRNS@f&IDAT[c`߁j( #XaXɫUPfՊ-0IENDB`protector/textures/doors_steel_a.png000066400000000000000000000004211411216315300203040ustar00rootroot00000000000000PNG  IHDR(-S9PLTE޾̷๹111&&&8qtRNS@fIDATMY0D1a Tm2Oi4в;`hSE99#,zA,g M` kz MT+6^BJ̥`4"o~Tf-.ND}#I| ~6zIENDB`protector/textures/doors_steel_b.png000066400000000000000000000004041411216315300203060ustar00rootroot00000000000000PNG  IHDR(-S6PLTE׶ڹ&&&333...;kIDAT5!CKEnv4kbQ0=P%Jx}nBZ KD+{'=GN4 d"OL 0ӈP ]iGke3#3W,z}tXw(cqppcOIENDB`protector/textures/doors_trapdoor.png000066400000000000000000000004011411216315300205200ustar00rootroot00000000000000PNG  IHDR(-S?PLTEf0xAl7aK'SB'h2z@vR I)5p97;&*C4)+B˪u~lQg9qIENDB`protector/textures/doors_trapdoor_side.png000066400000000000000000000003511411216315300215300ustar00rootroot00000000000000PNG  IHDRh6bKGD pHYs  tIME'2vIDAT(10ȾChx 3|6OEw,0dN=t"!`W₄Bs(Ӽhj>50&'+h,n=U ]M%$r%v+4IENDB`protector/textures/doors_trapdoor_steel.png000066400000000000000000000002311411216315300217150ustar00rootroot00000000000000PNG  IHDRb PLTEe-g]MtRNS@f;IDATc VZ444 I$7Z5B< T`m` f$%*IENDB`protector/textures/doors_trapdoor_steel_side.png000066400000000000000000000001451411216315300227250ustar00rootroot00000000000000PNG  IHDRb PLTEބU7IDATc`P `X%OG;IENDB`protector/textures/doors_wood.png000066400000000000000000000002021411216315300176350ustar00rootroot00000000000000PNG  IHDRb PLTE8% W@uQqHtRNS@f$IDAT[c`߁j(pF\ G႕ZE u%UZ^IENDB`protector/textures/doors_wood_a.png000066400000000000000000000004461411216315300201470ustar00rootroot00000000000000PNG  IHDR(-SEPLTEH6hU8jW9cQ6cJ#^F"lQ(E3bP4_N4hN'ZCM:aH"J7T?oZ;111@0O;ZI1&&&WtRNS@fIDATU D/h4j1v&yXegXr΂@ btS~@.̮!l Se rZtyZe FbS6gY!ʿvV2#Ŭ%lF{d|!#IENDB`protector/textures/doors_wood_b.png000066400000000000000000000004431411216315300201450ustar00rootroot00000000000000PNG  IHDR(-SBPLTEeL%gM%`H#bI#hO'G5_G"bP5]E!L9Q=mQ)eR6YBiV9oT*]L2D3&&&@/nZ;000:1IDATEW0 Ciɒg8W-? j2*m_8 31>>raCRW)srQ"LFp1k=y9;IENDB`protector/textures/johnsmith/000077500000000000000000000000001411216315300167625ustar00rootroot00000000000000protector/textures/johnsmith/protector_logo.png000066400000000000000000000015361411216315300225360ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME #[IDATX]HQmnn:unΏ,R3>l vEitUIQIEa``(%AJINM#5u1usJN~sp 6\(XVR ͹b}Au_8IOiW+Jm("eiQQas 'Ce!]fpj$x/QgޟzJ(3Qm850:2;_pDw?o';i6'hˀ>[^ F, %IUqwuwMZ 6O( `6Uؤ%7NfC~1p٭HsKϞJg?xrq8 22 then r = 22 end minetest.register_craftitem("protector:tool", { description = S("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", "protector:protect_hidden"}) 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 = (r * 2) + 1 local pit = user:get_look_vertical() -- 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(r * 2, pos, user:get_player_name(), true, 3) then minetest.chat_send_player(name, S("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", "protector:protect_hidden"}) > 0 then minetest.chat_send_player(name, S("Protector already in place!")) return end -- do not place protector out of map bounds if minetest.find_node_near(pos, 1, {"ignore"}) then 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, S("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 -- do not replace containers with inventory space local inv = minetest.get_inventory({type = "node", pos = pos}) if inv then minetest.chat_send_player(name, S("Cannot place protector, container at") .. " " .. minetest.pos_to_string(pos)) return end -- protection check for other mods like Areas if minetest.is_protected(pos, name) then minetest.chat_send_player(name, S("Cannot place protector, already protected at") .. " " .. minetest.pos_to_string(pos)) return 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, S("Protector placed at") .. " " .. minetest.pos_to_string(pos)) end, }) -- tool recipe local df = "default:steel_ingot" if not minetest.registered_items[df] then df = "mcl_core:iron_ingot" end minetest.register_craft({ output = "protector:tool", recipe = { {df, df, df}, {df, "protector:protect", df}, {df, df, df}, } })