code:
local S = protector.intllib
local radius = (tonumber(minetest.setting_get("protector_radius")) or 5)
local hud = {}
local hud_timer = 0
local hud_interval = (tonumber(minetest.setting_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


code:
-- 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

-- 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
	and factions.get_player_faction(name) ~= nil
	and factions.get_player_faction(meta:get_string("owner")) ==
			factions.get_player_faction(name) then

		return true
	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

	if factions_available
	and factions.get_player_faction(meta:get_string("owner")) 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

-- Infolevel:
-- 0 for no info
-- 1 for "This area is owned by <owner> !" if you can't dig
-- 2 for "This area is owned by <owner>.
-- 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

		minetest.chat_send_player(digger,
			S("Spawn @1 has been protected up to a @2 block radius.",
				minetest.pos_to_string(statspawn), protector_spawn))

		return false
	end

	-- find the protector nodes
	local pos = minetest.find_nodes_in_area(
		{x = pos.x - r, y = pos.y - r, z = pos.z - r},
		{x = pos.x + r, y = pos.y + r, z = pos.z + r},
		{"protector:protect", "protector:protect2", "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

				minetest.chat_send_player(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:set_hp(player:get_hp() - protector_hurt)
				end)
			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

-- 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)
		local player_name = placer:get_player_name() or ""

		meta:set_string("owner", player_name)
		meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner")))
		meta:set_string("members", "")

		logging.log("protector place", string.format("at %s by \"%s\"",
				minetest.pos_to_string(pos), player_name))
	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 = function(pos, oldnode)
		local objects = minetest.get_objects_inside_radius(pos, 0.5)
		for _, v in ipairs(objects) do
			v:remove()
		end

		logging.log("protector remove", string.format("at %s", minetest.pos_to_string(pos)))
	end,
})

-- 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},
	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)
		local player_name = placer:get_player_name() or ""

		meta:set_string("owner", player_name)
		meta:set_string("infotext", S("Protection (owned by @1)", meta:get_string("owner")))
		meta:set_string("members", "")

		logging.log("protector place", string.format("at %s by \"%s\"",
				minetest.pos_to_string(pos), player_name))
	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 = function(pos, oldnode)
		local objects = minetest.get_objects_inside_radius(pos, 0.5)
		for _, v in ipairs(objects) do
			v:remove()
		end

		logging.log("protector remove", string.format("at %s", minetest.pos_to_string(pos)))
	end,
})

-- recipes to switch between protectors
minetest.register_craft({
	type = "shapeless",
	output = "protector:protect",
	recipe = {"protector:protect2"}
})

minetest.register_craft({
	type = "shapeless",
	output = "protector:protect2",
	recipe = {"protector:protect"}
})

-- check formspec buttons or when name entered
minetest.register_on_player_receive_fields(function(player, formname, fields)

	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 = 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 (S("[MOD] Protector Redo loaded"))

repo_name: Desour/PlayMinetestServer

license: mit


code:
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.

-- 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


code:
# German translation for PROTECTOR MOD.
# Copyright (C) 2018 TenPlus1
# This file is distributed under the same license as the PROTECTOR MOD package.
# Xanthin <xanthin@wiuwiu.de>, 2016.
# CodeXP <codexp@gmx.net>, 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 <codexp@gmx.net>\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 "<names list>"
msgstr "<Namensliste der Spieler>"

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Ersetze Besitzer der Störschützer mit neuem Besitzer"

#: admin.lua
msgid "<owner name> <name to replace with>"
msgstr "<Name des Besitzers> <Name des neuen Besitzers>"

#: 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"


code:
# 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 "<names list>"
msgstr "<Lista de nombres>"

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Reemplace el propietario del protector con el nombre proporcionado"

#: admin.lua
msgid "<owner name> <name to replace with>"
msgstr "<Nombre del propietario> <Nombre del nuevo propietario>"

#: 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"


code:
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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 "<names list>"
msgstr ""

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr ""

#: admin.lua
msgid "<owner name> <name to replace with>"
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"


code:
# Italian translation for PROTECTOR MOD.
# Copyright (C) 2020 Hamlet
# This file is distributed under the same license as the PROTECTOR MOD package.
# Xanthin <xanthin@wiuwiu.de>, 2016.
# CodeXP <codexp@gmx.net>, 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 <hamlatgitlab@riseup.net>\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 "<names list>"
msgstr "<elenco nomi>"

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Sostituisci il proprietario del protettore col nome fornito"

#: admin.lua
msgid "<owner name> <name to replace with>"
msgstr "<nome proprietario> <nome con cui sostituirlo>"

#: 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"


code:
# 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)
<names list>=<Namensliste der Spieler>
Replace Protector Owner with name provided=Ersetze Besitzer der Störschützer mit neuem Besitzer
<owner name> <name to replace with>=<Name des Besitzers> <Name des neuen Besitzers>
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


code:
# 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)
<names list>=<Lista de nombres>
Replace Protector Owner with name provided=Reemplace el propietario del protector con el nombre proporcionado
<owner name> <name to replace with>=<Nombre del propietario> <Nombre del nuevo propietario>
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


code:
# 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)
<names list>=<liste de noms>
Replace Protector Owner with name provided=Remplacer le propriétaire du protecteur par le nom fourni
<owner name> <name to replace with>=<nom du propriétaire> <nom à remplacer>
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


code:
# 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)
<names list>=<elenco nomi>
Replace Protector Owner with name provided=Sostituisci il proprietario del protettore col nome fornito
<owner name> <name to replace with>=<nome proprietario> <nome con cui sostituirlo>
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


code:
# textdomain: protector
# author: CodeXP
# last update: 2018/Jul/10

### admin.lua ###
Remove Protectors around players (separate names with spaces)=Удалить защиту рядом с игроками (перечислить имена, разделяя пробелами)
<names list>=<список имён>
Replace Protector Owner with name provided=Заменить владельца защиты новым владельцем
<owner name> <name to replace with>=<имя владельца> <имя нового владельца>
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=[MOD] Модификация \"Переделанная Защита\" загружена
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


code:
# 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)
<names list>=<isim listesi>
Replace Protector Owner with name provided=Koruyucu Sahibini belirtilen adla değiştirin
<owner name> <name to replace with>=<sahip adı> <değiştirilecek ad>
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


code:
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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 "<names list>"
msgstr "<список имён>"

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr "Заменить владельца защиты новым владельцем"

#: admin.lua
msgid "<owner name> <name to replace with>"
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"


code:
# Template for PROTECTOR MOD.
# Copyright (C) 2018 TenPlus1
# This file is distributed under the same license as the PROTECTOR MOD package.
# Xanthin <xanthin@wiuwiu.de>, 2016.
# CodeXP <codexp@gmx.net>, 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 <codexp@gmx.net>\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 "<names list>"
msgstr ""

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr ""

#: admin.lua
msgid "<owner name> <name to replace with>"
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 ""


code:
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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 "<names list>"
msgstr ""

#: admin.lua
msgid "Replace Protector Owner with name provided"
msgstr ""

#: admin.lua
msgid "<owner name> <name to replace with>"
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"


code:
-- 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


code: name = protector


code:
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(S("[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(S("[Protector] pvp_protect not active, update your version of Minetest"))

	end
else
	print(S("[Protector] pvp_protect is disabled"))
end


code:
#    Size of protected area around protection node limiting player interaction
protector_radius (Protector Radius) int 5

#    Flips player around when accessing protected area to stop lag griefing
protector_flip (Protector Flip) bool false

#    Hurts player by amount entered when accessing protected area, 0 to disable
protector_hurt (Protector Hurt) int 0

#    Sets a protected area around spawn by node radius given
protector_spawn (Protector Spawn) int 0

#    Enables PVP inside of protected areas
protector_pvp (Protector PVP) bool false

#    When true will allow PVP inside protected spawn area
protector_pvp_spawn (Protector PVP Spawn) int 0

#    When true will allow PVP inside all protected areas at night time only
protector_night_pvp (Protector Night PVP) bool false

#    Interval in seconds that protection field is shown
protector_show_interval (Protector Show Interval) int 5

#    Interval in seconds that HUD ownership text is updated, 0 to disable
protector_hud_interval (Protector HUD Interval) int 5

#    Enables craft recipe for protection block
protector_recipe (Enable Protector recipe) bool true


code:
-- protector placement tool (thanks to Shara for code and idea)

local S = protector.intllib

-- get protection radius
local r = tonumber(minetest.settings:get("protector_radius")) or 5

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 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},
	}
})


code:
# Reportlist

This mod add a report list of players to minetest.
A Player can only report an other player ones!
Players can be reported by just typing /report <name> <reason>

You can show the reportlist formspec: /reportlist
Reset a player reports with: /report_reset <name>

It's compatible with xban and sban

License: MIT

Created by [Lejo](https://github.com/Lejo1)


code:
--[[This is a mod that contains a player register with the count of the reports.
          Mod created by Lejo!]]
local settings = {
  time_played_to_report = 3600, --  in seconds  Only needed when using playtime
	time_of_tempban = minetest.settings:get("report_tempbantime") or 259200, --  bantime inseconds
}
reportlist = {}
local s = minetest.get_mod_storage()
local new_table = {r = {}}
--[[
Player table schem:
reporter = {["name"] = {reason = "..", time=os.time()}}
{r = {["name"] = {r = "Reason", t = os.time()}},
}
]]

function reportlist.get_data(name)
  local data = s:get_string(name)
  if data ~= "" then
    return minetest.deserialize(data)
  else s:set_string(name, new_table)
    return new_table
  end
end

function reportlist.get_all_data()
  local out = {}
  for name, data in pairs(s:to_table().fields) do
    out[name] = minetest.deserialize(data)
  end
  return out
end

function reportlist.set_data(name, data)
  s:set_string(name, minetest.serialize(data))
end

function reportlist.remove_data(name)
	s:set_string(name, "")
end

function reportlist.exist(name)
	if s:get_string(name) ~= "" then
		return true
	else return false
	end
end

function reportlist.is_reporter(name, reportername)
  local data = reportlist.get_data(name)
  if data.r[reportername] then
    return true
  end
end

function reportlist.add_reporter(name, reportername, reason)
	local data = reportlist.get_data(name)
  data.r[reportername] = {r = reason, t = os.time()}
  reportlist.set_data(name, data)
end

--  Add the report Command
minetest.register_chatcommand("report", {
  privs = {shout = true},
  params = "<name> <reason>",
  description = "Use it to report players, if they are hacking, cheating...",
  func = function(name, param)
    local reported, reason = param:match("(%S+)%s+(.+)")
    if type(reported) == "string" and type(reason) == "string" then
      if minetest.player_exists(reported) then
        if name ~= reported and minetest.get_player_ip(name) ~= minetest.get_player_ip(reported) then
          if minetest.get_player_by_name(reported) then
            if not playtime or playtime.get_total_playtime(name) >= settings.time_played_to_report then
              reportlist.add_reporter(reported, name, reason)
              minetest.log("action", "Player "..reported.." has been reported by "..name)
              return true, reported.." has been reported!"
            else return false, "You have to play longer to report a player!"
            end
          else return false, "The Player "..reported.." is not online!"
          end
        else return false, "You can't report yourself or somebody out of you ip-Group."
        end
      else return false, "The Player doesn't exist."
      end
    else return false, "Please specific a playername and a reason"
    end
  end,
})

function reportlist.show_form(name, fields)
	local reported = fields.name or ""
  local tabledata = ""
  local form = "size[14,5.5]" ..
  "label[3.5,0.1;Reportlist. Enter playername to do an action.]" ..
  "button[11.2,2.6;2.5,1;reset;reset]" ..
  "field[11.5,4;2.5,1;reason;Ban Reason;]" ..
  "button[11.2,4.4;2.5,1;tempban;Tempban(default 3 days)]" ..
  "field[11.5,1;1.7,1;name;Player Name;"..reported.."]" ..
  "field_close_on_enter[name;false]" ..
  "button[12.9,0.7;0.8,1;go;Go]"
  if fields and fields.name and fields.name ~= "" then
		if reportlist.exist(fields.name) then
    	local data = reportlist.get_data(fields.name)
    	for playername, d in pairs(data.r) do
      	local pdata = reportlist.get_data(playername)
      	tabledata = tabledata..playername..","..os.date("%c", d.t)..","..minetest.formspec_escape(d.r)..","
    	end
		else tabledata = "Player hasn't been reported yet"
		end
    form = form .. "tablecolumns[text;text;text]"
  else
    for name, data in pairs(reportlist.get_all_data()) do
      local count = 0
      local pstuff = ""
      for name, d in pairs(data.r) do
        pstuff = pstuff.."1,"..name..","..os.date("%c", d.t)..","..minetest.formspec_escape(d.r)..","
        count = count + 1
      end
      tabledata = tabledata.."0,"..name..","..count..",,"..pstuff
    end
    form = form .. "tablecolumns[tree;text;text;text]"
  end
  form = form .. "table[0.2,0.6;10.8,4.6;reports;"..tabledata..";1]"
  minetest.show_formspec(name, "reportlist:reportlist", form)
end

minetest.register_on_player_receive_fields(function(player, formname, fields)
  if formname == "reportlist:reportlist" then
  	local name = player:get_player_name()
  	if minetest.get_player_privs(name).ban then
			if fields.name and fields.name ~= "" then
				if fields.reset then
					reportlist.remove_data(fields.name)
					minetest.chat_send_player(name, "Reseted the reports of the player "..fields.name)
				elseif fields.tempban and fields.reason and fields.reason ~= "" then
					--  Support for sban mod or others using this command
					if minetest.registered_chatcommands["tempban"] then
						local success, msg = minetest.registered_chatcommands["tempban"].func(name, fields.name.." "..tostring(settings.time_of_tempban).." "..fields.reason)
						minetest.chat_send_player(name, msg)
					--  Xban support
					elseif xban and xban.ban_player then
						local success, err = xban.ban_player(fields.name, name, settings.time_of_tempban, fields.reason)
						if success then
							minetest.chat_send_player(name, "Banned "..fields.name)
						else minetest.chat_send_player(name, "Failed to ban "..fields.name.." Err:"..err)
						end
					else minetest.chat_send_player(name, "No compatible ban mod found, use sban or xban!")
					end
				end
			end
      if fields.reset or fields.tempban or fields.go or fields.key_enter then
    	   reportlist.show_form(name, fields)
      end
  	else
    	minetest.log("error", "Player "..name.." sent fields to reportlist:reportlist without the ban privi")
    	minetest.kick_player(name)
  	end
	end
end)

--  Add a chat command to get the report counter
minetest.register_chatcommand("reportlist", {
	privs = {ban = true},
	params = "[<name>]",
	description = "Use it to open the reportlist form.",
	func = function(name, param)
  	reportlist.show_form(name, {name = param})
	end,
})

--  Add a chat command to set the report counter
minetest.register_chatcommand("report_reset", {
	privs = {ban = true},
	params = "<name>",
	description = "Use it to reset the reports of a player.",
	func = function(name, param)
  	if minetest.player_exists(param) then
    	reportlist.remove_data(name)
    	minetest.chat_send_player(name, "Reseted the reports of the player "..param)
  	else minetest.chat_send_player(name, "The Player "..param.." doesn't exist.")
  	end
	end,
})


code:
name = reportlist
description = A Report System to manage player reporting
optional_depends = xban, sban
release = 4118
title = Reportlist
author = Lejo


code:
# Restart Gift
Server restarts and crashes are a necessary but annoying part of the Mintest game, so this mod tries to make them more bearable by giving players who log back in after a restart/crash a little gift.

## Usage
Modify the variables on lines 1 to 7 of init.lua to change gift timeout (amount of time after a restart players who were kicked have to log in bu to recieve a gift) in seconds (default: 300 seconds or 5 minutes), gift name (default: "default:mese"), and gift count (default: 1)


code: Gives a gift to players who were kicked because of a server restart or crash if they come back within the gift timeout (default: 5 minutes)


code:
-- Set this to how soon after crash/restart the person must log back in by to recieve a gift
local gift_timeout = 300

-- Set this to the name of the gift you wish to give
local gift_name = "default:mese"
-- Set this to how many of the gift you wish to give
local gift_count = 1

local function load_data(filename)
    local file = io.open(filename, "r")
    if file then
        local table = minetest.deserialize(file:read("*all"))
        file:close()
        if type(table) == "table" then
            return table
        else
            return {}
        end
    end
end

local function save_data(filename, data)
    local file = io.open(filename, "w")
    if file then
        file:write(minetest.serialize(data))
        file:close()
    end
end

local db_filename = minetest.get_worldpath().."/kicked_players.txt"
local kicked_players = load_data(db_filename) or {} -- loads file if it exists, or makes empty table

local current_players = {}

local give_gifts = true
minetest.after(gift_timeout, function()
    give_gifts = false
end)

local function get_description(name)
    if not minetest.registered_items[name] then return name end
    return minetest.registered_items[name].description or name
end

minetest.register_on_joinplayer(function(player)
    name = player:get_player_name()
    if give_gifts == true then
        if kicked_players[name] then
            player:get_inventory():add_item("main", ItemStack(gift_name.." "..tostring(gift_count)))
            minetest.chat_send_player(name, "We're sorry you were kicked, have "..tostring(gift_count).." "..get_description(gift_name).." as a thank you gift for coming back :)")
            kicked_players[name] = nil
        end
    end
    current_players[name] = true
    save_data(db_filename, current_players)
end)

minetest.register_on_leaveplayer(function(player)
    name = player:get_player_name()
    current_players[name] = nil
    save_data(db_filename, current_players)
end)


code:
# Auto detect text files and perform LF normalization
* text=auto


code:
MultiCraft Game mod: signs
==========================

License of source code
----------------------
Copyright (C) 2018-2020 MultiCraft Development Team

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3.0 of the License, or
(at your option) any later version.

http://www.gnu.org/licenses/lgpl-3.0.html

License of textures
-------------------
Copyright (C) 2018-2020 MultiCraft Development Team

CC-BY-SA 4.0


code:
local vadd = vector.add
local floor, pi = math.floor, math.pi

local sign_positions = {
	[0] = {{x =  0,    y = 0.18, z = -0.07}, pi},
	[1] = {{x = -0.07, y = 0.18, z =  0},    pi * 0.5},
	[2] = {{x =  0,    y = 0.18, z =  0.07}, 0},
	[3] = {{x =  0.07, y = 0.18, z =  0},    pi * 1.5}
}

local wall_sign_positions = {
	[0] = {{x =  0.43, y = -0.005, z =  0},    pi * 0.5},
	[1] = {{x = -0.43, y = -0.005, z =  0},    pi * 1.5},
	[2] = {{x =  0,    y = -0.005, z =  0.43}, pi},
	[3] = {{x =  0,    y = -0.005, z = -0.43}, 0}
}

local function generate_sign_line_texture(str, row)
	local leftover = floor((20 - #str) * 16 / 2)
	local texture = ""
	for i = 1, 20 do
		local char = str:byte(i)
		if char and (char >= 32 and char <= 126) then
			texture = texture .. ":" .. (i - 1) * 16 + leftover .. ","
					.. row * 20 .. "=signs_" .. char .. ".png"
		end
	end

	return texture
end

local function find_any(str, pair, start)
	local ret = 0 -- 0 if not found (indices start at 1)
	for _, needle in pairs(pair) do
		local first = str:find(needle, start)
		if first then
			if ret == 0 or first < ret then
				ret = first
			end
		end
	end

	return ret
end

local disposable_chars = {["\n"] = true, ["\r"] = true, ["\t"] = true, [" "] = true}
local wrap_chars = {"\n", "\r", "\t", " ", "-", "/", ";", ":", ",", ".", "?", "!"}
local slugify = dofile(minetest.get_modpath("signs") .. "/slugify.lua")

local function generate_sign_texture(str)
	if not str or str == "" then
		return "blank.png"
	end
	local row = 0
	local texture = "[combine:" .. 16 * 20 .. "x100"
	local result = {}

	-- Transliterate text
	str = slugify(str)

	while #str > 0 do
		if row > 4 then
			break
		end
		local wrap_i = 0
		local keep_i = 0 -- The last character that was kept
		while wrap_i < #str do
			wrap_i = find_any(str, wrap_chars, wrap_i + 1)
			if wrap_i > 20 then
				if keep_i > 1 then
					wrap_i = keep_i
				else
					wrap_i = 20
				end
				break
			elseif wrap_i == 0 then
				if #str <= 20 then
					wrap_i = #str
				elseif keep_i > 0 then
					wrap_i = keep_i
				else
					wrap_i = #str
				end
				break
			elseif str:sub(wrap_i, wrap_i) == "\n" then
				break
			end
			if not disposable_chars[str:sub(wrap_i, wrap_i)] then
				keep_i = wrap_i
			elseif wrap_i > 1 and not disposable_chars[str:sub(wrap_i - 1, wrap_i - 1)] then
				keep_i = wrap_i - 1
			end
		end
		if wrap_i > 20 then
			wrap_i = 20
		end
		local start_remove = 0
		if disposable_chars[str:sub(1, 1)] then
			start_remove = 1
		end
		local end_remove = 0
		if disposable_chars[str:sub(wrap_i, wrap_i)] then
			end_remove = 1
		end
		local line_string = str:sub(1 + start_remove, wrap_i - end_remove)
		str = str:sub(wrap_i + 1)
		if line_string ~= "" then
			result[row] = line_string
		end
		row = row + 1
	end

	local empty = 0
	if row == 1 then
		empty = 2
	elseif row < 4 then
		empty = 1
	end

	for r, s in pairs(result) do
		texture = texture .. generate_sign_line_texture(s, r + empty)
	end

	return texture
end

minetest.register_entity("signs:sign_text", {
	visual = "upright_sprite",
	visual_size = {x = 0.7, y = 0.6},
	collisionbox = {0},
	pointable = false,
	on_activate = function(self)
		local ent = self.object
		local pos = ent:get_pos()

		-- remove entity for missing sign
		local node_name = minetest.get_node(pos).name
		if not node_name == "signs:sign" and not node_name == "signs:wall_sign" then
			ent:remove()
			return
		end

		local meta = minetest.get_meta(pos)
		local meta_texture = meta:get_string("sign_texture")

		local texture
		if meta_texture and meta_texture ~= "" then
			texture = meta_texture
		else
			local meta_text = meta:get_string("sign_text")
			if meta_text and meta_text ~= "" then
				texture = generate_sign_texture(meta_text)
			else
				texture = "blank.png"
			end
			meta:set_string("sign_texture", texture)
		end

		ent:set_properties({
			textures = {texture, "blank.png"}
		})
	end
})

local function check_text(pos)
	local meta = minetest.get_meta(pos)
	local text = meta:get_string("sign_text")
	local objects = minetest.get_objects_inside_radius(pos, 0.5)

	if text and text ~= "" then
		local count = 0
		for _, obj in pairs(objects) do
			local ent = obj:get_luaentity()
			if ent and ent.name == "signs:sign_text" then
				count = count + 1
				if count > 1 then
					obj:remove()
				end
			end
		end
		if count == 0 then
			local node = minetest.get_node(pos)
			local p2 = node.param2 or -1
			local sign_pos = sign_positions
			if node.name == "signs:wall_sign" then
				p2 = p2 - 2
				sign_pos = wall_sign_positions
			end
			if p2 > 3 or p2 < 0 then return end
			local obj = minetest.add_entity(
				vadd(pos, sign_pos[p2][1]), "signs:sign_text")
			obj:set_yaw(sign_pos[p2][2])
		end
	else
		for _, obj in pairs(objects) do
			local ent = obj:get_luaentity()
			if ent and ent.name == "signs:sign_text" then
				obj:remove()
			end
		end
	end
end

minetest.register_lbm({
	label = "Check for sign text",
	name = "signs:sign_text",
	nodenames = {"signs:sign", "signs:wall_sign"},
	run_at_every_load = true,
	action = check_text
})

local function construct(pos)
	local meta = minetest.get_meta(pos)
	meta:set_string("formspec", "size[5,3]" ..
			"textarea[1.15,0.3;3.3,2;Dtext;" .. "Enter your text:" .. ";${sign_text}]" ..
			"button_exit[0.85,2;3.3,1;;" .. "Save" .. "]")
end

local function destruct(pos)
	for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.5)) do
		local ent = obj:get_luaentity()
		if ent and ent.name == "signs:sign_text" then
			obj:remove()
		end
	end
end

local function receive_fields(pos, _, fields, sender, wall)
	local text = fields.Dtext
	if not text then return end
	if minetest.is_protected(pos, sender:get_player_name()) then
		return
	end
	text = text:sub(1, 256)
	local p2 = minetest.get_node(pos).param2
	local sign_pos = sign_positions
	if wall then
		p2 = p2 - 2
		sign_pos = wall_sign_positions
	end
	if not p2 or p2 > 3 or p2 < 0 then return end
	local sign
	for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.5)) do
		local ent = obj:get_luaentity()
		if ent and ent.name == "signs:sign_text" then
			sign = obj
			break
		end
	end
	if not sign then
		sign = minetest.add_entity(
			vadd(pos, sign_pos[p2][1]), "signs:sign_text")
	else
		sign:set_pos(vadd(pos, sign_pos[p2][1]))
	end
	local texture = generate_sign_texture(text)
	sign:set_properties({
		textures = {texture, "blank.png"}
	})
	sign:set_yaw(sign_pos[p2][2])
	local meta = minetest.get_meta(pos)
	meta:set_string("sign_text", text)
	meta:set_string("sign_texture", texture)
	meta:set_string("infotext", text)
end

minetest.register_node("signs:sign", {
	description = "Sign",
	tiles = {"signs_wood.png"},
	drawtype = "nodebox",
	paramtype = "light",
	paramtype2 = "facedir",
	node_placement_prediction = "",
	sunlight_propagates = true,
	node_box = {
		type = "fixed",
		fixed = {
			{-0.375, -0.125, -0.063, 0.375,  0.5,   0.063},
			{-0.063, -0.5,   -0.063, 0.063, -0.125, 0.063}
		}
	},
	groups = {oddly_breakable_by_hand = 1, choppy = 3, attached_node = 1},

	on_place = function(itemstack, placer, pointed_thing)
		if pointed_thing.type == "node" then
			local under = pointed_thing.under
			local node = minetest.get_node(under)
			local node_def = minetest.registered_nodes[node.name]
			if node_def and node_def.on_rightclick and
					not (placer and placer:is_player() and
					placer:get_player_control().sneak) then
				return node_def.on_rightclick(under, node, placer, itemstack,
					pointed_thing) or itemstack
			end

			local undery = pointed_thing.under.y
			local posy = pointed_thing.above.y

			local _, result
			if undery < posy then -- Floor sign
				itemstack, result = minetest.item_place(itemstack,
						placer, pointed_thing)
			elseif undery == posy then -- Wall sign
				_, result = minetest.item_place(ItemStack("signs:wall_sign"),
						placer, pointed_thing)
				if result and not (creative and creative.is_enabled_for and
						creative.is_enabled_for(placer)) then
					itemstack:take_item()
				end
			end
			if result then
				minetest.sound_play({name = "default_place_node_hard"},
						{pos = pointed_thing.above})
			end
		end

		return itemstack
	end,

	on_construct = construct,
	on_destruct = destruct,
	on_punch = check_text,
	on_receive_fields = receive_fields
})

minetest.register_node("signs:wall_sign", {
	tiles = {"signs_wood.png"},
	drawtype = "nodebox",
	paramtype = "light",
	paramtype2 = "wallmounted",
	node_box = {
		type = "wallmounted",
		wall_side = {-0.5, -0.313, -0.438, -0.438, 0.313, 0.438}
	},
	drop = "signs:sign",
	walkable = false,
	groups = {oddly_breakable_by_hand = 1, choppy = 3,
		not_in_creative_inventory = 1, attached_node = 1},

	on_construct = construct,
	on_destruct = destruct,
	on_punch = check_text,

	on_receive_fields = function(pos, _, fields, sender)
		receive_fields(pos, _, fields, sender, true)
	end
})

minetest.register_craft({
	output = "signs:sign 3",
	recipe = {
		{"group:wood", "group:wood", "group:wood"},
		{"group:wood", "group:wood", "group:wood"},
		{"", "group:stick", ""}
	}
})

minetest.register_craft({
	type = "fuel",
	recipe = "signs:sign",
	burntime = 10
})


code:
name = signs
depends = default
description = Lightweight wooden signs with text display and automatic formatting.


code:
#textures/character_*.png
textures/player_*.png
#meta/character_*.txt
meta/player_*.txt


code:
# Skinsdb Interface

## skins.get_player_skin(player)
Return the skin object assigned to the player. Returns default if nothing assigned

## skins.assign_player_skin(player, skin)
Check if allowed and assign the skin for the player without visual updates. The "skin" parameter could be the skin key or the skin object
Returns false if skin is not valid or applicable to player

## skins.update_player_skin(player)
Update selected skin visuals on player

## skins.set_player_skin(player, skin)
Function for external usage on skin selection. This function assign the skin, call the skin:set_skin(player) hook to update dynamic skins, then update the visuals

## skins.get_skin_format(file)
Returns the skin format version ("1.0" or "1.8"). File is an open file handle to the texture file

## skins.get_skinlist(assignment, select_unassigned)
Obsolete - use get_skinlist_for_player() or get_skinlist_with_meta() instead

## skins.get_skinlist_for_player(playername)
Get all allowed skins for player. All public and all player's private skins. If playername not given only public skins returned

## skins.get_skinlist_with_meta(key, value)
Get all skins with metadata key is set to value. Example:
skins.get_skinlist_with_meta("playername", playername) - Get all private skins (w.o. public) for playername

## skins.new(key, object)
Create and register a new skin object for given key
  - key: Unique skins key, like "character_1"
  - object: Optional. Could be a prepared object with redefinitions

## skins.get(key)
Get existing skin object

HINT: During build-up phase maybe the next statement is usefull
```
local skin = skins.get(name) or skins.new(name)
```

# Skin object

## skin:get_key()
Get the unique skin key

## skin:set_texture(texture)
Set the skin texture - usually at the init time only

## skin:get_texture()
Get the skin texture for any reason. Note to apply them the skin:set_skin() should be used

Could be redefined for dynamic texture generation

## skin:set_preview(texture)
Set the skin preview - usually at the init time only

## skin:get_preview()
Get the skin preview

Could be redefined for dynamic preview texture generation

## skin:set_skin(player)
Hook for dynamic skins updates on select. Is called in skins.set_player_skin()
In skinsdb the default implementation for this function is empty.

skin:apply_skin_to_player(player)
Apply the skin to the player. Called in skins.update_player_skin() to update visuals

## skin:set_meta(key, value)
Add a meta information to the skin object

Note: the information is not stored, therefore should be filled each time during skins registration

## skin:get_meta(key)
The next metadata keys are filled or/and used interally in skinsdb framework
  - name - A name for the skin
  - author - The skin author
  - license - THe skin texture license
  - assignment - (obsolete) is "player:playername" in case the skin is assigned to be privat for a player
  - playername - Player assignment for private skin. Set false for skins not usable by all players (like NPC-Skins), true or nothing for all player skins
  - in_inventory_list - If set to false the skin is not visible in inventory skins selection but can be still applied to the player
  - _sort_id - Thi skins lists are sorted by this field for output (internal key)

## skin:get_meta_string(key)
Same as get_meta() but does return "" instead of nil if the meta key does not exists

## skin:is_applicable_for_player(playername)
Returns whether this skin is applicable for player "playername" or not, like private skins


code:
# skinsdb

This Minetest mod offers changeable player skins with a graphical interface for multiple inventory mods.

## Features

- Flexible skins API to manage the database
- [character_creator](https://github.com/minetest-mods/character_creator) support for custom skins
- Skin change menu for sfinv (in minetest_game) and [unified_inventory](https://forum.minetest.net/viewtopic.php?t=12767)
- Skins change menu and command line using chat command /skinsdb (set | show | list | list private | list public | ui)
- Supported by [smart_inventory](https://forum.minetest.net/viewtopic.php?t=16597) for the skin selection
- Skin previews supported in selection
- Additional information for each skin
- Support for different skins lists: public and a per-player list are currently implemented
- Full [3d_armor](https://forum.minetest.net/viewtopic.php?t=4654) support
- Compatible to 1.0 and 1.8 Minecraft skins format

## Installing skins

### Download from the database

1) Get Minetest 5.1.0-dev-cb00632 or newer
2) Start your world
3) Run `/skinsdb_download_skins <skindb start page> <amount of pages>`
4) Wait for the Minetest server to shut down
5) Start the server again

You might want to run `minetest` in a Terminal/Console window to check the log output instantly.

### Manual addition

1) Copy your skin textures to `textures` as documented in `textures/readme.txt`
2) Create `meta/character_<name>.txt` with the following fields (separated by new lines):
    * Skin name
    * Author
    * Skin license

## License:
- GPLv3
- skin texture licenses: See "meta" folder

### Credits

- RealBadAngel (unified_inventory)
- Zeg9 (skinsdb)
- cornernote (source code)
- Krock (source code)
- bell07 (source code)
- stujones11 (player models)
- sirrobzeroone (skins)


code:
-- get current skin
local storage = minetest.get_mod_storage()

function skins.get_player_skin(player)
	if player:get_attribute("skinsdb:skin_key") then
		storage:set_string(player:get_player_name(), player:get_attribute("skinsdb:skin_key"))
		player:set_attribute("skinsdb:skin_key", nil)
	end
	local skin = storage:get_string(player:get_player_name())
	return skins.get(skin) or skins.get(skins.default)
end

-- Assign skin to player
function skins.assign_player_skin(player, skin)
	local skin_obj
	if type(skin) == "string" then
		skin_obj = skins.get(skin)
	else
		skin_obj = skin
	end

	if not skin_obj then
		return false
	end

	if skin_obj:is_applicable_for_player(player:get_player_name()) then
		local skin_key = skin_obj:get_key()
		if skin_key == skins.default then
			skin_key = ""
		end
		storage:set_string(player:get_player_name(), skin_key)
	else
		return false
	end
	return true
end

-- update visuals
function skins.update_player_skin(player)
	if skins.armor_loaded then
		-- all needed is wrapped and implemented in 3d_armor mod
		armor:set_player_armor(player)
	else
		-- do updates manually without 3d_armor
		skins.get_player_skin(player):apply_skin_to_player(player)
		if minetest.global_exists("sfinv") and sfinv.enabled then
			sfinv.set_player_inventory_formspec(player)
		end
	end
end

-- Assign and update - should be used on selection externally
function skins.set_player_skin(player, skin)
	local success = skins.assign_player_skin(player, skin)
	if success then
		skins.get_player_skin(player):set_skin(player)
		skins.update_player_skin(player)
	end
	return success
end

-- Check Skin format (code stohlen from stu's multiskin)
function skins.get_skin_format(file)
	file:seek("set", 1)
	if file:read(3) == "PNG" then
		file:seek("set", 16)
		local ws = file:read(4)
		local hs = file:read(4)
		local w = ws:sub(3, 3):byte() * 256 + ws:sub(4, 4):byte()
		local h = hs:sub(3, 3):byte() * 256 + hs:sub(4, 4):byte()
		if w >= 64 then
			if w == h then
				return "1.8"
			elseif w == h * 2 then
				return "1.0"
			end
		end
	end
end