code:
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local worldpath = minetest.get_worldpath()
local last_punch_time = {}
local pending_players = {}
local timer = 0

-- support for i18n
armor_i18n = { }
armor_i18n.gettext, armor_i18n.ngettext = dofile(modpath.."/intllib.lua")

-- local functions
local S = armor_i18n.gettext
local F = minetest.formspec_escape

dofile(modpath.."/api.lua")

-- integration test
if minetest.settings:get_bool("enable_3d_armor_integration_test") then
        dofile(modpath.."/integration_test.lua")
end

-- Legacy Config Support

local input = io.open(modpath.."/armor.conf", "r")
if input then
	dofile(modpath.."/armor.conf")
	input:close()
end
input = io.open(worldpath.."/armor.conf", "r")
if input then
	dofile(worldpath.."/armor.conf")
	input:close()
end
for name, _ in pairs(armor.config) do
	local global = "ARMOR_"..name:upper()
	if minetest.global_exists(global) then
		armor.config[name] = _G[global]
	end
end
if minetest.global_exists("ARMOR_MATERIALS") then
	armor.materials = table.copy(ARMOR_MATERIALS)
end
if minetest.global_exists("ARMOR_FIRE_NODES") then
	armor.fire_nodes = table.copy(ARMOR_FIRE_NODES)
end

-- Load Configuration

for name, config in pairs(armor.config) do
	local setting = minetest.settings:get("armor_"..name)
	if type(config) == "number" then
		setting = tonumber(setting)
	elseif type(config) == "boolean" then
		setting = minetest.settings:get_bool("armor_"..name)
	end
	if setting ~= nil then
		armor.config[name] = setting
	end
end
for material, _ in pairs(armor.materials) do
	local key = "material_"..material
	if armor.config[key] == false then
		armor.materials[material] = nil
	end
end

-- Mod Compatibility

if minetest.get_modpath("technic") then
	armor.formspec = armor.formspec..
		"label[5,2.5;"..F(S("Radiation"))..":  armor_group_radiation]"
	armor:register_armor_group("radiation")
end
local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"}
for _, mod in pairs(skin_mods) do
	local path = minetest.get_modpath(mod)
	if path then
		local dir_list = minetest.get_dir_list(path.."/textures")
		for _, fn in pairs(dir_list) do
			if fn:find("_preview.png$") then
				armor:add_preview(fn)
			end
		end
		armor.skin_mod = mod
	end
end
if not minetest.get_modpath("moreores") then
	armor.materials.mithril = nil
end
if not minetest.get_modpath("ethereal") then
	armor.materials.crystal = nil
end

dofile(modpath.."/armor.lua")

-- Armor Initialization

armor.formspec = armor.formspec..
	"label[5,1;"..F(S("Level"))..": armor_level]"..
	"label[5,1.5;"..F(S("Heal"))..":  armor_attr_heal]"
if armor.config.fire_protect then
	armor.formspec = armor.formspec.."label[5,2;"..F(S("Fire"))..":  armor_attr_fire]"
end
armor:register_on_damage(function(player, index, stack)
	local name = player:get_player_name()
	local def = stack:get_definition()
	if name and def and def.description and stack:get_wear() > 60100 then
		minetest.chat_send_player(name, S("Your @1 is almost broken!", def.description))
		minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0})
	end
end)
armor:register_on_destroy(function(player, index, stack)
	local name = player:get_player_name()
	local def = stack:get_definition()
	if name and def and def.description then
		minetest.chat_send_player(name, S("Your @1 got destroyed!", def.description))
		minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0})
	end
end)

local function validate_armor_inventory(player)
	-- Workaround for detached inventory swap exploit
	local _, inv = armor:get_valid_player(player, "[validate_armor_inventory]")
	local pos = player:get_pos()
	if not inv then
		return
	end
	local armor_prev = {}
	local attribute_meta = player:get_meta() -- I know, the function's name is weird but let it be like that. ;)
	local armor_list_string = attribute_meta:get_string("3d_armor_inventory")
	if armor_list_string then
		local armor_list = armor:deserialize_inventory_list(armor_list_string)
		for i, stack in ipairs(armor_list) do
			if stack:get_count() > 0 then
				armor_prev[stack:get_name()] = i
			end
		end
	end
	local elements = {}
	local player_inv = player:get_inventory()
	for i = 1, 6 do
		local stack = inv:get_stack("armor", i)
		if stack:get_count() > 0 then
			local item = stack:get_name()
			local element = armor:get_element(item)
			if element and not elements[element] then
				if armor_prev[item] then
					armor_prev[item] = nil
				else
					-- Item was not in previous inventory
					armor:run_callbacks("on_equip", player, i, stack)
				end
				elements[element] = true;
			else
				inv:remove_item("armor", stack)
				minetest.item_drop(stack, player, pos)
				-- The following code returns invalid items to the player's main
				-- inventory but could open up the possibity for a hacked client
				-- to receive items back they never really had. I am not certain
				-- so remove the is_singleplayer check at your own risk :]
				if minetest.is_singleplayer() and player_inv and
						player_inv:room_for_item("main", stack) then
					player_inv:add_item("main", stack)
				end
			end
		end
	end
	for item, i in pairs(armor_prev) do
		local stack = ItemStack(item)
		-- Previous item is not in current inventory
		armor:run_callbacks("on_unequip", player, i, stack)
	end
end

local function init_player_armor(initplayer)
	local name = initplayer:get_player_name()
	local pos = initplayer:get_pos()
	if not name or not pos then
		return false
	end
	local armor_inv = minetest.create_detached_inventory(name.."_armor", {
		on_put = function(inv, listname, index, stack, player)
			validate_armor_inventory(player)
			armor:save_armor_inventory(player)
			armor:set_player_armor(player)
		end,
		on_take = function(inv, listname, index, stack, player)
			validate_armor_inventory(player)
			armor:save_armor_inventory(player)
			armor:set_player_armor(player)
		end,
		on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
			validate_armor_inventory(player)
			armor:save_armor_inventory(player)
			armor:set_player_armor(player)
		end,
		allow_put = function(inv, listname, index, put_stack, player)
			local element = armor:get_element(put_stack:get_name())
			if not element then
				return 0
			end
			for i = 1, 6 do
				local stack = inv:get_stack("armor", i)
				local def = stack:get_definition() or {}
				if def.groups and def.groups["armor_"..element]
						and i ~= index then
					return 0
				end
			end
			return 1
		end,
		allow_take = function(inv, listname, index, stack, player)
			return stack:get_count()
		end,
		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
			return count
		end,
	}, name)
	armor_inv:set_size("armor", 6)
	if not armor:load_armor_inventory(initplayer) and armor.migrate_old_inventory then
		local player_inv = initplayer:get_inventory()
		player_inv:set_size("armor", 6)
		for i=1, 6 do
			local stack = player_inv:get_stack("armor", i)
			armor_inv:set_stack("armor", i, stack)
		end
		armor:save_armor_inventory(initplayer)
		player_inv:set_size("armor", 0)
	end
	for i=1, 6 do
		local stack = armor_inv:get_stack("armor", i)
		if stack:get_count() > 0 then
			armor:run_callbacks("on_equip", initplayer, i, stack)
		end
	end
	armor.def[name] = {
		init_time = minetest.get_gametime(),
		level = 0,
		state = 0,
		count = 0,
		groups = {},
	}
	for _, phys in pairs(armor.physics) do
		armor.def[name][phys] = 1
	end
	for _, attr in pairs(armor.attributes) do
		armor.def[name][attr] = 0
	end
	for group, _ in pairs(armor.registered_groups) do
		armor.def[name].groups[group] = 0
	end
	local skin = armor:get_player_skin(name)
	armor.textures[name] = {
		skin = skin,
		armor = "3d_armor_trans.png",
		wielditem = "3d_armor_trans.png",
		preview = armor.default_skin.."_preview.png",
	}
	local texture_path = minetest.get_modpath("player_textures")
	if texture_path then
		local dir_list = minetest.get_dir_list(texture_path.."/textures")
		for _, fn in pairs(dir_list) do
			if fn == "player_"..name..".png" then
				armor.textures[name].skin = fn
				break
			end
		end
	end
	armor:set_player_armor(initplayer)
	return true
end

-- Armor Player Model

default.player_register_model("3d_armor_character.b3d", {
	animation_speed = 30,
	textures = {
		armor.default_skin..".png",
		"3d_armor_trans.png",
		"3d_armor_trans.png",
	},
	animations = {
		stand = {x=0, y=79},
		lay = {x=162, y=166},
		walk = {x=168, y=187},
		mine = {x=189, y=198},
		walk_mine = {x=200, y=219},
		sit = {x=81, y=160},
	},
})

minetest.register_on_player_receive_fields(function(player, formname, fields)
	local name = armor:get_valid_player(player, "[on_player_receive_fields]")
	if not name then
		return
	end
  local player_name = player:get_player_name()
	for field, _ in pairs(fields) do
		if string.find(field, "skins_set") then
			minetest.after(0, function()
        local pplayer = minetest.get_player_by_name(player_name)
        if player then
          local skin = armor:get_player_skin(name)
          armor.textures[name].skin = skin
          armor:set_player_armor(pplayer)
        end
			end)
		end
	end
end)

minetest.register_on_joinplayer(function(player)
	default.player_set_model(player, "3d_armor_character.b3d")
  local player_name = player:get_player_name()

	minetest.after(0, function()
    local pplayer = minetest.get_player_by_name(player_name)
		if pplayer and init_player_armor(pplayer) == false then
			pending_players[pplayer] = 0
		end
	end)
end)

minetest.register_on_leaveplayer(function(player)
	local name = player:get_player_name()
	if name then
		armor.def[name] = nil
		armor.textures[name] = nil
	end
	pending_players[player] = nil
end)

if armor.config.drop == true or armor.config.destroy == true then
	minetest.register_on_dieplayer(function(player)
		local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]")
		if not name then
			return
		end
		local drop = {}
		for i=1, armor_inv:get_size("armor") do
			local stack = armor_inv:get_stack("armor", i)
			if stack:get_count() > 0 then
				table.insert(drop, stack)
				armor:run_callbacks("on_unequip", player, i, stack)
				armor_inv:set_stack("armor", i, nil)
			end
		end
		armor:save_armor_inventory(player)
		armor:set_player_armor(player)
		local pos = player:get_pos()
		if pos and armor.config.destroy == false then
			minetest.after(armor.config.bones_delay, function()
				local meta = nil
				local maxp = vector.add(pos, 16)
				local minp = vector.subtract(pos, 16)
				local bones = minetest.find_nodes_in_area(minp, maxp, {"bones:bones"})
				for _, p in pairs(bones) do
					local m = minetest.get_meta(p)
					if m:get_string("owner") == name then
						meta = m
						break
					end
				end
				if meta then
					local inv = meta:get_inventory()
					for _,stack in ipairs(drop) do
						if inv:room_for_item("main", stack) then
							inv:add_item("main", stack)
						else
							armor.drop_armor(pos, stack)
						end
					end
				else
					for _,stack in ipairs(drop) do
						armor.drop_armor(pos, stack)
					end
				end
			end)
		end
	end)
end

if armor.config.punch_damage == true then
	minetest.register_on_punchplayer(function(player, hitter,
			time_from_last_punch, tool_capabilities)
		local name = player:get_player_name()
		if name then
			armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
			last_punch_time[name] = minetest.get_gametime()
		end
	end)
end

minetest.register_on_player_hpchange(function(player, hp_change, reason)
	if player and reason.type ~= "drown" and reason.hunger == nil
			and hp_change < 0 then
		local name = player:get_player_name()
		if name then
			local heal = armor.def[name].heal
			if heal >= math.random(100) then
				hp_change = 0
			end
			-- check if armor damage was handled by fire or on_punchplayer
			local time = last_punch_time[name] or 0
			if time == 0 or time + 1 < minetest.get_gametime() then
				armor:punch(player)
			end
		end
	end
	return hp_change
end, true)

minetest.register_globalstep(function(dtime)
	timer = timer + dtime
	if timer > armor.config.init_delay then
		for player, count in pairs(pending_players) do
			local remove = init_player_armor(player) == true
			pending_players[player] = count + 1
			if remove == false and count > armor.config.init_times then
				minetest.log("warning", S("3d_armor: Failed to initialize player"))
				remove = true
			end
			if remove == true then
				pending_players[player] = nil
			end
		end
		timer = 0
	end
end)

-- Fire Protection and water breathing, added by TenPlus1.

if armor.config.fire_protect == true then
	-- override hot nodes so they do not hurt player anywhere but mod
	for _, row in pairs(armor.fire_nodes) do
		if minetest.registered_nodes[row[1]] then
			minetest.override_item(row[1], {damage_per_second = 0})
		end
	end
else
	print (S("[3d_armor] Fire Nodes disabled"))
end

if armor.config.water_protect == true or armor.config.fire_protect == true then
	minetest.register_globalstep(function(dtime)
		armor.timer = armor.timer + dtime
		if armor.timer < armor.config.update_time then
			return
		end
		for _,player in pairs(minetest.get_connected_players()) do
			local name = player:get_player_name()
			local pos = player:get_pos()
			local hp = player:get_hp()
			if not name or not pos or not hp then
				return
			end
			-- water breathing
			if armor.config.water_protect == true then
				if armor.def[name].water > 0 and
						player:get_breath() < 10 then
					player:set_breath(10)
				end
			end
			-- fire protection
			if armor.config.fire_protect == true then
				local fire_damage = true
				pos.y = pos.y + 1.4 -- head level
				local node_head = minetest.get_node(pos).name
				pos.y = pos.y - 1.2 -- feet level
				local node_feet = minetest.get_node(pos).name
				-- is player inside a hot node?
				for _, row in pairs(armor.fire_nodes) do
					-- check fire protection, if not enough then get hurt
					if row[1] == node_head or row[1] == node_feet then
						if fire_damage == true then
							armor:punch(player, "fire")
							last_punch_time[name] = minetest.get_gametime()
							fire_damage = false
						end
						if hp > 0 and armor.def[name].fire < row[2] then
							hp = hp - row[3] * armor.config.update_time
							player:set_hp(hp)
							break
						end
					end
				end
			end
		end
		armor.timer = 0
	end)
end


code:
minetest.log("warning", "[TEST] integration-test enabled!")

minetest.register_on_mods_loaded(function()
	minetest.after(1, function()

		local data = minetest.write_json({ success = true }, true);
		local file = io.open(minetest.get_worldpath().."/integration_test.json", "w" );
		if file then
			file:write(data)
			file:close()
		end

		file = io.open(minetest.get_worldpath().."/registered_nodes.txt", "w" );
		if file then
			for name in pairs(minetest.registered_nodes) do
				file:write(name .. '\n')
			end
			file:close()
		end

		minetest.log("warning", "[TEST] integration tests done!")
		minetest.request_shutdown("success")
	end)
end)

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:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-06 18:20+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: El nombre del jugador es nulo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player inventory is nil @1"
msgstr "3d_armor: El inventario del jugador es nulo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: La armadura desconectada es nula @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: La referencia del jugador es nula @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Casco de admin"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Peto de admin"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Polainas de admin"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "Botas de admin"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Casco de madera"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Peto de madera"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Polainas de madera"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "Botas de madera"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Casco de cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Peto de cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Polainas de cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "Botas de cactus"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Casco de acero"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "Peto de acero"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Polainas de acero"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "Botas de acero"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Casco de bronce"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Peto de bronce"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Polainas de bronce"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "Botas de bronce"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Casco de diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Peto de diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Polainas de diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "Botas de diamante"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Casco de oro"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Peto de oro"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Polainas de oro"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "Botas de oro"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Casco de mitrilo"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Peto de mitrilo"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Polainas de mitrilo"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "Botas de mitrilo"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Casco de cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Peto de cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Polainas de cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "Botas de cristal"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiación"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Nivel"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Salud"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Fuego"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "¡Tu @1 fue destruído!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: Fallo en la inicialización del jugador"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Nodos de fuego desabilitados"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: Mod cargado, pero sin ser usado."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Volver"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Armadura"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: Mod cargado, pero sin ser usado."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Parte arriba maniquí armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Maniquí para armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Maniquí para armadura"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Maniquí para armadura (bloqueado)"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Maniquí para armadura (propiedad de @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: Mod cargado, pero sin ser usado."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "Armadura 3d"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "¡Armadura no inicializada!"

#: ../hazmat_suit/init.lua
msgid "hazmat_suit: Mod loaded but unused."
msgstr "hazmat_suit: Mod cargado, pero sin ser usado."

#: ../hazmat_suit/init.lua
msgid "Hazmat Helmet"
msgstr "Casco de hazmat"

#: ../hazmat_suit/init.lua
msgid "Hazmat Chestplate"
msgstr "Peto de hazmat"

#: ../hazmat_suit/init.lua
msgid "Hazmat Sleeve"
msgstr "Manga de hazmat"

#: ../hazmat_suit/init.lua
msgid "Hazmat Leggins"
msgstr "Polainas de hazmat"

#: ../hazmat_suit/init.lua
msgid "Hazmat Boots"
msgstr "Botas de hazmat"

#: ../hazmat_suit/init.lua
msgid "Hazmat Suit"
msgstr "Traje de hazmat"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Escudo de admin"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Escudo de madera"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Escudo de madera mejorado"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Escudo de cactus"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Escudo de cactus mejorado"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Escudo de acero"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Escudo de bronce"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Escudo de diamante"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Escudo de oro"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Escudo de mitrilo"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Escudo de cristal"

#: ../technic_armor/init.lua
msgid "technic_armor: Mod loaded but unused."
msgstr "technic_armor: Mod cargado, pero no usado."

#: ../technic_armor/init.lua
msgid "Lead"
msgstr "Plomo"

#: ../technic_armor/init.lua
msgid "Brass"
msgstr "Latón"

#: ../technic_armor/init.lua
msgid "Cast Iron"
msgstr "Hierro fundido"

#: ../technic_armor/init.lua
msgid "Carbon Steel"
msgstr "Acero carbono"

#: ../technic_armor/init.lua
msgid "Stainless Steel"
msgstr "Acero inoxidable"

#: ../technic_armor/init.lua
msgid "Tin"
msgstr "Estaño"

#: ../technic_armor/init.lua
msgid "Silver"
msgstr "Plata"

#: ../technic_armor/init.lua
msgid "Helmet"
msgstr "Casco"

#: ../technic_armor/init.lua
msgid "Chestplate"
msgstr "Peto"

#: ../technic_armor/init.lua
msgid "Leggins"
msgstr "Polainas"

#: ../technic_armor/init.lua
msgid "Boots"
msgstr "Botas"

#: ../technic_armor/init.lua
msgid "Shield"
msgstr "Escudo"

#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string)
#: ../technic_armor/init.lua
msgid "@1 @2"
msgstr "@2 de @1"


code:
# French translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# fat115 <fat115@framasoft.org>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:24+0200\n"
"PO-Revision-Date: 2018-07-23 21:30+0200\n"
"Last-Translator: fat115 <fat115@framasoft.org>\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"
"X-Generator: Poedit 1.8.12\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor : Référence au joueur non trouvée @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor : Nom du joueur non trouvé @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor : Inventaire détaché pour l'armure non trouvé @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Casque d'admin"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Cuirasse d'admin"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Jambières d'admin"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "Bottes d'admin"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Casque en bois"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Cuirasse en bois"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Jambières en bois"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "Bottes en bois"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Casque en cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Cuirasse en cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Jambières en cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "Bottes en cactus"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Casque en acier"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr " = Cuirasse en acier"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Jambières en acier"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "Bottes en acier"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Casque en bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Cuirasse en bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Jambières en bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "Bottes en bronze"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Casque en diamant"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Cuirasse en diamant"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Jambières en diamant"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "Bottes en diamant"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Casque en or"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Cuirasse en or"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Jambières en or"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "Bottes en or"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Casque en mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Cuirasse en mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Jambières en mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "Bottes en mithril"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Casque en cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Cuirasse en cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Jambières en cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "Bottes en cristal"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiation"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Niveau"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Soins"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Fire"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "Une partie de votre armure a été détruite : @1 !"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor : Impossible d'initialiser le joueur"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Noeuds de type feu désactivés"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip : Mod chargé mais inutilisé."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Retour"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Armure"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv : Mod chargé mais inutilisé."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Haut de support d'armure"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Support d'armure"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Support d'armure"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Support d'armure verrouillé"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Support d'armure (propriété de @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui : Mod chargé mais inutilisé."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "Armure 3d"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "Armure non initialisée !"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Bouclier d'admin"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Bouclier en bois"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Bouclier en bois amélioré"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Bouclier en cactus"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Bouclier en cactus amélioré"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Bouclier en acier"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Bouclier en bronze"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Bouclier en diamant"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Bouclier en or"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Bouclier en mithril"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Bouclier en cristal"


code:
# Italian translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Italian localization file for the 3D Armor module\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:24+0200\n"
"PO-Revision-Date: 2018-07-23 21:30+0200\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: ITALIANO\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.6.10\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: Il riferimento alla/al giocatrice/tore è nullo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: Il nome della/del gicatrice/tore è nullo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: L'inventario staccato dell'armatura è nullo @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Elmo dell'amministratrice/tore"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Corazza dell'amministratrice/tore"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Gambali dell'amministratrice/tore"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "Stivali dell'amministratrice/tore"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Elmo di legno"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Corazza di legno"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Gambali di legno"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "Stivali di legno"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Elmo di cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Corazza di cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Gambali di cactus"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "Stivali di cactus"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Elmo di acciaio"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "Corazza di acciaio"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Gambali di acciaio"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "Stivali di acciaio"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Elmo di bronzo"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Corazza di bronzo"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Gambali di bronzo"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "Stivali di bronzo"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Elmo di diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Corazza di diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Gambali di diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "Stivali di diamante"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Elmo d'oro"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Corazza d'oro"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Gambali d'oro"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "Stivali d'oro"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Elmo di mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Corazza di mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Gambali di mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "Stivali di mithril"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Elmo di cristallo"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Corazza di cristallo"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Gambali di cristallo"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "Stivali di cristallo"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiazione"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Livello"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Guarigione"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Fuoco"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "Il/i vostro/i @1 è/sono stato/i distrutto/i!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: Inizializzazione della/del giocatrice/tore fallita"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Nodi fuoco disabilitati"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: Mod caricato ma inutilizzato."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Indietro"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Armatura"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: Mod caricato ma inutilizzato."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Parte superiore del supporto per armatura"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Supporto per armatura"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Supporto per armatura"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Supporto per armatura chiuso a chiave"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Supporto per armatura (di proprietà di @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: Mod caricato ma inutilizzato."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "Armatura 3D"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "Armatura non inizializzata!"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Scudo dell'amministratrice/tore"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Scudo di legno"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Scudo di legno migliorato"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Scudo di cactus"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Scudo di cactus migliorato"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Scudo di acciaio"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Scudo di bronzo"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Scudo di diamante"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Scudo d'oro"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Scudo di mithril"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Scudo di cristallo"


code:
# Malay translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# MuhdNurHidayat (MNH48) <mnh48mail@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:21+0200\n"
"PO-Revision-Date: 2018-07-23 21:30+0200\n"
"Last-Translator: MuhdNurHidayat (MNH48) <mnh48mail@gmail.com>\n"
"Language-Team: \n"
"Language: ms\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.6\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: Rujukan pemain tiada nilai @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: Nama pemain tiada nilai @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: Inventori perisai terpisah tiada nilai @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Helmet Pentadbir"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Perisai Dada Pentadbir"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Perisai Kaki Pentadbir"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "But Pentadbir"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Helmet Kayu"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Perisai Dada Kayu"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Perisai Kaki Kayu"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "But Kayu"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Helmet Kaktus"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Perisai Dada Kaktus"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Perisai Kaki Kaktus"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "But Kaktus"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Helmet Keluli"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "Perisai Dada Keluli"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Perisai Kaki Keluli"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "But Keluli"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Helmet Gangsa"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Perisai Dada Gangsa"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Perisai Kaki Gangsa"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "But Gangsa"

# 'Diamond' should be translated as 'intan' because the more common word 'berlian' is only specifically used for the gemstone diamond.
#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Helmet Intan"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Perisai Dada Intan"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Perisai Kaki Intan"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "But Intan"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Helmet Emas"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Perisai Dada Emas"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Perisai Kaki Emas"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "But Emas"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Helmet Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Perisai Dada Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Perisai Kaki Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "But Mithril"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Helmet Kristal"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Perisai Dada Kristal"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Perisai Kaki Kristal"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "But Kristal"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiasi"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Tahap"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Pulih"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Api"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "@1 anda telah musnah!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: Gagal mengasalkan pemain"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Nod-nod Api dilumpuhkan"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: Mods dimuatkan tetapi tidak digunakan."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Kembali"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Perisai"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Bhg atas dirian perisai"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Dirian perisai"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Dirian Perisai"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Dirian perisai Berkunci"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Dirian Perisai (milik @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: Mods dimuatkan tetapi tidak digunakan."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "Perisai 3d"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "Perisai tidak diasalkan!"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Perisai Pegang Pentadbir"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Perisai Pegang Kayu"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Perisai Pegang Kayu Kukuh"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Perisai Pegang Kaktus"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Perisai Pegang Kaktus Kukuh"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Perisai Pegang Keluli"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Perisai Pegang Gangsa"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Perisai Pegang Intan"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Perisai Pegang Emas"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Perisai Pegang Mithril"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Perisai Pegang Kristal"


code:
# LANGUAGE translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# BrunoMine <borgesdossantosbruno@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: 3d_armor\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:24+0200\n"
"PO-Revision-Date: 2018-11-08 13:12-0200\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.0.6\n"
"Last-Translator: BrunoMine <borgesdossantosbruno@gmail.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: pt\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: Referência Jogador é nula @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: Nome de jogador é nulo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: Inventario avulso de armadura é nulo @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Capacete de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Peitoral de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Calças de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "Botas de Administrador"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Capacete de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Peitoral de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Calças de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "Botas de Madeira"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Capacete de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Peitoral de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Calças de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "Botas de Madeira"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Capacete de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "Peitoral de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Calças de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "Botas de Aço"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Capacete de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Peitoral de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Calças de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "Botas de Bronze"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Capacete de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Peitoral de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Calças de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "Botas de Diamante"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Capacete de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Peitoral de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Calças de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "Botas de Ouro"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Capacete de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Peitoral de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Calças de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "Botas de Mithril"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Capacete de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Peitoral de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Calças de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "Botas de Cristal"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiação"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Nível"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Saúde"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Fogo"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "@1 foi destruído(a)!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: Falha ao inicializar jogador"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Nodes de gofo desabilitados"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: Mod carregado mas inoperante."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Voltar"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Armadura"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: Mod carregado mas inoperante."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Topo de estande de armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Estande de armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Estande de Armadura"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Estande de Armadura Trancada"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Estande de Armadura (pertente a @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: Mod carregado mas inoperante."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "3d Armor"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "Armadura não inicializada!"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Escudo de Administrador"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Escudo de Madeira"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Escudo de Madeira Melhorado"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Escudo de Cacto"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Escudo de Cacto Melhorado"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Escudo de Aço"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Escudo de Bronze"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Escudo de Diamante"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Escudo de Ouro"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Escudo de Mithril"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Escudo de Cristal"


code:
# LANGUAGE translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# BrunoMine <borgesdossantosbruno@gmail.com>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: 3d_armor\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:24+0200\n"
"PO-Revision-Date: 2018-11-08 13:12-0200\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.0.6\n"
"Last-Translator: BrunoMine <borgesdossantosbruno@gmail.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: pt_BR\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: Referência Jogador é nula @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: Nome de jogador é nulo @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: Inventario avulso de armadura é nulo @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "Capacete de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "Peitoral de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "Calças de Administrador"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "Botas de Administrador"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "Capacete de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "Peitoral de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "Calças de Madeira"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "Botas de Madeira"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "Capacete de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "Peitoral de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "Calças de Cacto"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "Botas de Madeira"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "Capacete de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "Peitoral de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "Calças de Aço"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "Botas de Aço"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "Capacete de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "Peitoral de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "Calças de Bronze"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "Botas de Bronze"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "Capacete de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "Peitoral de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "Calças de Diamante"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "Botas de Diamante"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "Capacete de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "Peitoral de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "Calças de Ouro"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "Botas de Ouro"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "Capacete de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "Peitoral de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "Calças de Mithril"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "Botas de Mithril"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "Capacete de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "Peitoral de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "Calças de Cristal"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "Botas de Cristal"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "Radiação"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "Nível"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "Saúde"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "Fogo"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "@1 foi destruído(a)!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: Falha ao inicializar jogador"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] Nodes de gofo desabilitados"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: Mod carregado mas inoperante."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "Voltar"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "Armadura"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: Mod carregado mas inoperante."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "Topo de estande de armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "Estande de armadura"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "Estande de Armadura"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "Estande de Armadura Trancada"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "Estande de Armadura (pertente a @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: Mod carregado mas inoperante."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "3d Armor"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "Armadura não inicializada!"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "Escudo de Administrador"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "Escudo de Madeira"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "Escudo de Madeira Melhorado"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "Escudo de Cacto"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "Escudo de Cacto Melhorado"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "Escudo de Aço"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "Escudo de Bronze"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "Escudo de Diamante"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "Escudo de Ouro"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "Escudo de Mithril"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "Escudo de Cristal"


code:
# Russian translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# CodeXP <codexp@gmx.net>, 2018.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 3d_armor\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:21+0200\n"
"PO-Revision-Date: 2018-07-23 21:30+0200\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"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr "3d_armor: Ссылка игрока является nil @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr "3d_armor: Имя игрока является nil @1"

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr "3d_armor: Отдельный инвентарь брони является nil @1"

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr "шлем админа"

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr "бронежилет админа"

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr "гамаши админа"

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr "ботинки админа"

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr "деревянный шлем"

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr "деревянный бронежилет"

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr "деревянные гамаши"

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr "деревянные ботинки"

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr "кактусовый шлем"

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr "кактусовый бронежилет"

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr "кактусовые гамаши"

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr "кактусовые ботинки"

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr "стальной шлем"

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr "стальной бронежилет"

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr "стальные гамаши"

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr "стальные ботинки"

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr "бронзовый шлем"

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr "бронзовый бронежилет"

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr "бронзовые гамаши"

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr "бронзовые ботинки"

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr "алмазный шлем"

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr "алмазный бронежилет"

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr "алмазные гамаши"

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr "алмазные ботинки"

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr "золотой шлем"

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr "золотой бронежилет"

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr "золотые гамаши"

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr "золотые ботинки"

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr "мифриловый шлем"

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr "мифриловый бронежилет"

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr "мифриловые гамаши"

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr "мифриловые ботинки"

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr "кристалловый шлем"

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr "кристалловый бронежилет"

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr "кристалловые гамаши"

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr "кристалловые ботинки"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr "излучение"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr "уровень"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr "исцеление"

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr "огонь"

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr "твой(и) @1 был(и) разрушен(ы)!"

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr "3d_armor: не смог подготовить игрока"

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr "[3d_armor] блоки огня отключены"

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr "3d_armor_ip: мод загружен но не используется."

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr "назад"

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr "бронь"

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr "3d_armor_sfinv: мод загружен но не используется."

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr "стойка для брони (верх)"

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr "стойка для брони"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr "стойка для брони"

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr "защищенная стойка для брони"

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr "стойка для брони (принадлежит @1)"

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr "3d_armor_ui: мод загружен но не используется."

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr "3D бронь"

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr "бронь не подготовлена!"

#: ../shields/init.lua
msgid "Admin Shield"
msgstr "щит админа"

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr "деревянный щит"

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr "улучшенный деревянный щит"

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr "кактусный щит"

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr "улучшенный кактусный щит"

#: ../shields/init.lua
msgid "Steel Shield"
msgstr "стальной щит"

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr "бронзовый щит"

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr "алмазный щит"

#: ../shields/init.lua
msgid "Gold Shield"
msgstr "золотой щит"

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr "мифриловый щит"

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr "кристалловый щит"


code:
# LANGUAGE translation for 3D ARMOR MOD
# Copyright (C) 2018 by Stuart Jones
# This file is distributed under the same license as the 3D ARMOR MOD package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-07-23 21:24+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../3d_armor/api.lua
msgid "3d_armor: Player reference is nil @1"
msgstr ""

#: ../3d_armor/api.lua
msgid "3d_armor: Player name is nil @1"
msgstr ""

#: ../3d_armor/api.lua
msgid "3d_armor: Detached armor inventory is nil @1"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Admin Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Admin Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Admin Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Admin Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Wood Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Wood Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Wood Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Wood Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Cactus Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Cactus Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Cactus Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Cactus Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Steel Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Steel Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Steel Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Steel Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Bronze Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Bronze Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Bronze Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Bronze Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Diamond Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Diamond Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Diamond Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Diamond Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Gold Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Gold Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Gold Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Gold Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Mithril Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Mithril Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Mithril Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Mithril Boots"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Crystal Helmet"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Crystal Chestplate"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Crystal Leggings"
msgstr ""

#: ../3d_armor/armor.lua
msgid "Crystal Boots"
msgstr ""

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Radiation"
msgstr ""

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Level"
msgstr ""

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Heal"
msgstr ""

#: ../3d_armor/init.lua ../3d_armor_ui/init.lua
msgid "Fire"
msgstr ""

#: ../3d_armor/init.lua
msgid "Your @1 got destroyed!"
msgstr ""

#: ../3d_armor/init.lua
msgid "3d_armor: Failed to initialize player"
msgstr ""

#: ../3d_armor/init.lua
msgid "[3d_armor] Fire Nodes disabled"
msgstr ""

#: ../3d_armor_ip/init.lua
msgid "3d_armor_ip: Mod loaded but unused."
msgstr ""

#: ../3d_armor_ip/init.lua
msgid "Back"
msgstr ""

#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua
msgid "Armor"
msgstr ""

#: ../3d_armor_sfinv/init.lua
msgid "3d_armor_sfinv: Mod loaded but unused."
msgstr ""

#: ../3d_armor_stand/init.lua
msgid "Armor stand top"
msgstr ""

#: ../3d_armor_stand/init.lua
msgid "Armor stand"
msgstr ""

#: ../3d_armor_stand/init.lua
msgid "Armor Stand"
msgstr ""

#: ../3d_armor_stand/init.lua
msgid "Locked Armor stand"
msgstr ""

#: ../3d_armor_stand/init.lua
msgid "Armor Stand (owned by @1)"
msgstr ""

#: ../3d_armor_ui/init.lua
msgid "3d_armor_ui: Mod loaded but unused."
msgstr ""

#: ../3d_armor_ui/init.lua
msgid "3d Armor"
msgstr ""

#: ../3d_armor_ui/init.lua
msgid "Armor not initialized!"
msgstr ""

#: ../shields/init.lua
msgid "Admin Shield"
msgstr ""

#: ../shields/init.lua
msgid "Wooden Shield"
msgstr ""

#: ../shields/init.lua
msgid "Enhanced Wood Shield"
msgstr ""

#: ../shields/init.lua
msgid "Cactus Shield"
msgstr ""

#: ../shields/init.lua
msgid "Enhanced Cactus Shield"
msgstr ""

#: ../shields/init.lua
msgid "Steel Shield"
msgstr ""

#: ../shields/init.lua
msgid "Bronze Shield"
msgstr ""

#: ../shields/init.lua
msgid "Diamond Shield"
msgstr ""

#: ../shields/init.lua
msgid "Gold Shield"
msgstr ""

#: ../shields/init.lua
msgid "Mithril Shield"
msgstr ""

#: ../shields/init.lua
msgid "Crystal Shield"
msgstr ""


code:
name = 3d_armor
depends = default
optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, intllib
description = Adds craftable armor that is visible to other players.


code:
# Intllib tool

please consider using the intllib tool to update locale files:

```../../intllib/tools/xgettext.sh ../**/*.lua```

make sure you are in `3d_armor` derectory before running this command


code:
#! /bin/bash

# To create a new translation:
#   msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot

cd "$(dirname "${BASH_SOURCE[0]}")/..";

# Extract translatable strings.
xgettext --from-code=UTF-8 \
		--language=Lua \
		--sort-by-file \
		--keyword=S \
		--keyword=NS:1,2 \
		--keyword=N_ \
		--add-comments='Translators:' \
		--add-location=file \
		-o locale/template.pot \
		$(find .. -name '*.lua')

# Update translations.
find locale -name '*.po' | while read -r file; do
	echo $file
	msgmerge --update $file locale/template.pot;
done


code:
3d_armor
inventory_plus?


code: Adds 3d_armor page to the inventory plus.


code:
-- support for i18n
local S = armor_i18n.gettext
local F = minetest.formspec_escape

if not minetest.global_exists("inventory_plus") then
	minetest.log("warning", S("3d_armor_ip: Mod loaded but unused."))
	return
end

armor.formspec = "size[8,8.5]button[6,0;2,0.5;main;"..F(S("Back")).."]"..armor.formspec
armor:register_on_update(function(player)
	local name = player:get_player_name()
	local formspec = armor:get_armor_formspec(name, true)
	local page = player:get_inventory_formspec()
	if page:find("detached:"..name.."_armor") then
		inventory_plus.set_inventory_formspec(player, formspec)
	end
end)

if minetest.get_modpath("crafting") then
	inventory_plus.get_formspec = function(player, page)
	end
end

minetest.register_on_joinplayer(function(player)
	inventory_plus.register_button(player,"armor", S("Armor"))
end)

minetest.register_on_player_receive_fields(function(player, formname, fields)
	if fields.armor then
		local name = armor:get_valid_player(player, "[on_player_receive_fields]")
		if not name then
			return
		end
		local formspec = armor:get_armor_formspec(name, true)
		inventory_plus.set_inventory_formspec(player, formspec)
	end
end)


code:
name = 3d_armor_ip
depends = 3d_armor
optional_depends = inventory_plus
description = Adds 3d_armor page to the inventory plus.


code:
3d_armor
sfinv?


code: Adds 3d_armor page to the sfinv inventory.


code:
-- support for i18n
local S = armor_i18n.gettext

if not minetest.global_exists("sfinv") then
	minetest.log("warning", S("3d_armor_sfinv: Mod loaded but unused."))
	return
end

sfinv.register_page("3d_armor:armor", {
	title = S("Armor"),
	get = function(self, player, context)
		local name = player:get_player_name()
		local formspec = armor:get_armor_formspec(name, true)
		return sfinv.make_formspec(player, context, formspec, false)
	end
})
armor:register_on_update(function(player)
	if sfinv.enabled then
		sfinv.set_player_inventory_formspec(player)
	end
end)


code:
name = 3d_armor_sfinv
depends = 3d_armor
optional_depends = sfinv
description = Adds 3d_armor page to the sfinv inventory.


code:
[mod] 3d Armor Stand [3d_armor_stand]
=====================================

Depends: 3d_armor

Adds a chest-like armor stand for armor storage and display.

Crafting
--------

F = Wooden Fence [default:fence_wood]
S = Steel Ingot [default:steel_ingot]

+---+---+---+
|   | F |   |
+---+---+---+
|   | F |   |
+---+---+---+
| S | S | S |
+---+---+---+


code:
-- support for i18n
local S = armor_i18n.gettext

local armor_stand_formspec = "size[8,7]" ..
	default.gui_bg ..
	default.gui_bg_img ..
	default.gui_slots ..
	default.get_hotbar_bg(0,3) ..
	"list[current_name;armor_head;3,0.5;1,1;]" ..
	"list[current_name;armor_torso;4,0.5;1,1;]" ..
	"list[current_name;armor_legs;3,1.5;1,1;]" ..
	"list[current_name;armor_feet;4,1.5;1,1;]" ..
	"image[3,0.5;1,1;3d_armor_stand_head.png]" ..
	"image[4,0.5;1,1;3d_armor_stand_torso.png]" ..
	"image[3,1.5;1,1;3d_armor_stand_legs.png]" ..
	"image[4,1.5;1,1;3d_armor_stand_feet.png]" ..
	"list[current_player;main;0,3;8,1;]" ..
	"list[current_player;main;0,4.25;8,3;8]"

local elements = {"head", "torso", "legs", "feet"}

local function drop_armor(pos)
	local meta = minetest.get_meta(pos)
	local inv = meta:get_inventory()
	for _, element in pairs(elements) do
		local stack = inv:get_stack("armor_"..element, 1)
		if stack and stack:get_count() > 0 then
			armor.drop_armor(pos, stack)
			inv:set_stack("armor_"..element, 1, nil)
		end
	end
end

local function get_stand_object(pos)
	local object = nil
	local objects = minetest.get_objects_inside_radius(pos, 0.5) or {}
	for _, obj in pairs(objects) do
		local ent = obj:get_luaentity()
		if ent then
			if ent.name == "3d_armor_stand:armor_entity" then
				-- Remove duplicates
				if object then
					obj:remove()
				else
					object = obj
				end
			end
		end
	end
	return object
end

local function update_entity(pos)
	local node = minetest.get_node(pos)
	local object = get_stand_object(pos)
	if object then
		if not string.find(node.name, "3d_armor_stand:") then
			object:remove()
			return
		end
	else
		object = minetest.add_entity(pos, "3d_armor_stand:armor_entity")
	end
	if object then
		local texture = "3d_armor_trans.png"
		local textures = {}
		local meta = minetest.get_meta(pos)
		local inv = meta:get_inventory()
		local yaw = 0
		if inv then
			for _, element in pairs(elements) do
				local stack = inv:get_stack("armor_"..element, 1)
				if stack:get_count() == 1 then
					local item = stack:get_name() or ""
					local def = stack:get_definition() or {}
					local groups = def.groups or {}
					if groups["armor_"..element] then
						if def.texture then
							table.insert(textures, def.texture)
						else
							table.insert(textures, item:gsub("%:", "_")..".png")
						end
					end
				end
			end
		end
		if #textures > 0 then
			texture = table.concat(textures, "^")
		end
		if node.param2 then
			local rot = node.param2 % 4
			if rot == 1 then
				yaw = 3 * math.pi / 2
			elseif rot == 2 then
				yaw = math.pi
			elseif rot == 3 then
				yaw = math.pi / 2
			end
		end
		object:set_yaw(yaw)
		object:set_properties({textures={texture}})
	end
end

local function has_locked_armor_stand_privilege(meta, player)
	local name = ""
	if player then
		if minetest.check_player_privs(player, "protection_bypass") then
			return true
		end
		name = player:get_player_name()
	end
	if name ~= meta:get_string("owner") then
		return false
	end
	return true
end

local function add_hidden_node(pos, player)
	local p = {x=pos.x, y=pos.y + 1, z=pos.z}
	local name = player:get_player_name()
	local node = minetest.get_node(p)
	if node.name == "air" and not minetest.is_protected(pos, name) then
		minetest.set_node(p, {name="3d_armor_stand:top"})
	end
end

local function remove_hidden_node(pos)
	local p = {x=pos.x, y=pos.y + 1, z=pos.z}
	local node = minetest.get_node(p)
	if node.name == "3d_armor_stand:top" then
		minetest.remove_node(p)
	end
end

minetest.register_node("3d_armor_stand:top", {
	description = S("Armor stand top"),
	paramtype = "light",
	drawtype = "plantlike",
	sunlight_propagates = true,
	walkable = true,
	pointable = false,
	diggable = false,
	buildable_to = false,
	drop = "",
	groups = {not_in_creative_inventory = 1},
	on_blast = function() end,
	tiles = {"3d_armor_trans.png"},
})

minetest.register_node("3d_armor_stand:armor_stand", {
	description = S("Armor stand"),
	drawtype = "mesh",
	mesh = "3d_armor_stand.obj",
	tiles = {"3d_armor_stand.png"},
	paramtype = "light",
	paramtype2 = "facedir",
	walkable = false,
	selection_box = {
		type = "fixed",
		fixed = {
			{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
			{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
		},
	},
	groups = {choppy=2, oddly_breakable_by_hand=2},
	sounds = default.node_sound_wood_defaults(),
	on_construct = function(pos)
		local meta = minetest.get_meta(pos)
		meta:set_string("formspec", armor_stand_formspec)
		meta:set_string("infotext", S("Armor Stand"))
		local inv = meta:get_inventory()
		for _, element in pairs(elements) do
			inv:set_size("armor_"..element, 1)
		end
	end,
	can_dig = function(pos, player)
		local meta = minetest.get_meta(pos)
		local inv = meta:get_inventory()
		for _, element in pairs(elements) do
			if not inv:is_empty("armor_"..element) then
				return false
			end
		end
		return true
	end,
	after_place_node = function(pos, placer)
		minetest.add_entity(pos, "3d_armor_stand:armor_entity")
		add_hidden_node(pos, placer)
	end,
	allow_metadata_inventory_put = function(pos, listname, index, stack)
		local def = stack:get_definition() or {}
		local groups = def.groups or {}
		if groups[listname] then
			return 1
		end
		return 0
	end,
	allow_metadata_inventory_move = function(pos)
		return 0
	end,
	on_metadata_inventory_put = function(pos)
		update_entity(pos)
	end,
	on_metadata_inventory_take = function(pos)
		update_entity(pos)
	end,
	after_destruct = function(pos)
		update_entity(pos)
		remove_hidden_node(pos)
	end,
	on_blast = function(pos)
		drop_armor(pos)
		armor.drop_armor(pos, "3d_armor_stand:armor_stand")
		minetest.remove_node(pos)
	end,
})

minetest.register_node("3d_armor_stand:locked_armor_stand", {
	description = S("Locked Armor stand"),
	drawtype = "mesh",
	mesh = "3d_armor_stand.obj",
	tiles = {"3d_armor_stand_locked.png"},
	paramtype = "light",
	paramtype2 = "facedir",
	walkable = false,
	selection_box = {
		type = "fixed",
		fixed = {
			{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
			{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
		},
	},
	groups = {choppy=2, oddly_breakable_by_hand=2},
	sounds = default.node_sound_wood_defaults(),
	on_construct = function(pos)
		local meta = minetest.get_meta(pos)
		meta:set_string("formspec", armor_stand_formspec)
		meta:set_string("infotext", S("Armor Stand"))
		meta:set_string("owner", "")
		local inv = meta:get_inventory()
		for _, element in pairs(elements) do
			inv:set_size("armor_"..element, 1)
		end
	end,
	can_dig = function(pos, player)
		local meta = minetest.get_meta(pos)
		local inv = meta:get_inventory()
		for _, element in pairs(elements) do
			if not inv:is_empty("armor_"..element) then
				return false
			end
		end
		return true
	end,
	after_place_node = function(pos, placer)
		minetest.add_entity(pos, "3d_armor_stand:armor_entity")
		local meta = minetest.get_meta(pos)
		meta:set_string("owner", placer:get_player_name() or "")
		meta:set_string("infotext", S("Armor Stand (owned by @1)", meta:get_string("owner")))
		add_hidden_node(pos, placer)
	end,
	allow_metadata_inventory_put = function(pos, listname, index, stack, player)
		local meta = minetest.get_meta(pos)
		if not has_locked_armor_stand_privilege(meta, player) then
			return 0
		end
		local def = stack:get_definition() or {}
		local groups = def.groups or {}
		if groups[listname] then
			return 1
		end
		return 0
	end,
	allow_metadata_inventory_take = function(pos, listname, index, stack, player)
		local meta = minetest.get_meta(pos)
		if not has_locked_armor_stand_privilege(meta, player) then
			return 0
		end
		return stack:get_count()
	end,
	allow_metadata_inventory_move = function(pos)
		return 0
	end,
	on_metadata_inventory_put = function(pos)
		update_entity(pos)
	end,
	on_metadata_inventory_take = function(pos)
		update_entity(pos)
	end,
	after_destruct = function(pos)
		update_entity(pos)
		remove_hidden_node(pos)
	end,
	on_blast = function(pos)
		-- Not affected by TNT
	end,
})

minetest.register_entity("3d_armor_stand:armor_entity", {
	physical = true,
	visual = "mesh",
	mesh = "3d_armor_entity.obj",
	visual_size = {x=1, y=1},
	collisionbox = {0,0,0,0,0,0},
	textures = {"3d_armor_trans.png"},
	pos = nil,
	timer = 0,
	on_activate = function(self)
		local pos = self.object:get_pos()
		if pos then
			self.pos = vector.round(pos)
			update_entity(pos)
		end
	end,
	on_blast = function(self, damage)
		local drops = {}
		local node = minetest.get_node(self.pos)
		if node.name == "3d_armor_stand:armor_stand" then
			drop_armor(self.pos)
			self.object:remove()
		end
		return false, false, drops
	end,
})

minetest.register_abm({
	nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:armor_stand"},
	interval = 15,
	chance = 1,
	action = function(pos, node, active_object_count, active_object_count_wider)
		local num
		num = #minetest.get_objects_inside_radius(pos, 0.5)
		if num > 0 then return end
		update_entity(pos)
	end
})

minetest.register_craft({
	output = "3d_armor_stand:armor_stand",
	recipe = {
		{"", "group:fence", ""},
		{"", "group:fence", ""},
		{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
	}
})

minetest.register_craft({
	output = "3d_armor_stand:locked_armor_stand",
	recipe = {
		{"3d_armor_stand:armor_stand", "default:steel_ingot"},
	}
})


code:
name = 3d_armor_stand
depends = 3d_armor


code:
3d_armor
unified_inventory?


code: Adds 3d_armor page to the unified inventory.


code:
-- support for i18n
local S = armor_i18n.gettext
local F = minetest.formspec_escape
local has_technic = minetest.get_modpath("technic") ~= nil

if not minetest.global_exists("unified_inventory") then
	minetest.log("warning", S("3d_armor_ui: Mod loaded but unused."))
	return
end

if unified_inventory.sfinv_compat_layer then
	return
end

armor:register_on_update(function(player)
	local name = player:get_player_name()
	if unified_inventory.current_page[name] == "armor" then
		unified_inventory.set_inventory_formspec(player, "armor")
	end
end)

unified_inventory.register_button("armor", {
	type = "image",
	image = "inventory_plus_armor.png",
	tooltip = S("3d Armor")
})

unified_inventory.register_page("armor", {
	get_formspec = function(player, perplayer_formspec)
		local fy = perplayer_formspec.formspec_y
		local name = player:get_player_name()
		if armor.def[name].init_time == 0 then
			return {formspec="label[0,0;"..F(S("Armor not initialized!")).."]"}
		end
		local formspec = "background[0.06,"..fy..";7.92,7.52;3d_armor_ui_form.png]"..
			"label[0,0;"..F(S("Armor")).."]"..
			"list[detached:"..name.."_armor;armor;0,"..fy..";2,3;]"..
			"image[2.5,"..(fy - 0.25)..";2,4;"..armor.textures[name].preview.."]"..
			"label[5.0,"..(fy + 0.0)..";"..F(S("Level"))..": "..armor.def[name].level.."]"..
			"label[5.0,"..(fy + 0.5)..";"..F(S("Heal"))..":  "..armor.def[name].heal.."]"..
			"listring[current_player;main]"..
			"listring[detached:"..name.."_armor;armor]"
		if armor.config.fire_protect then
			formspec = formspec.."label[5.0,"..(fy + 1.0)..";"..
				F(S("Fire"))..":  "..armor.def[name].fire.."]"
		end
		if has_technic then
			formspec = formspec.."label[5.0,"..(fy + 1.5)..";"..
				F(S("Radiation"))..":  "..armor.def[name].groups["radiation"].."]"
		end
		return {formspec=formspec}
	end,
})


code:
name = 3d_armor_ui
depends = 3d_armor
optional_depends = unified_inventory
description = Adds 3d_armor page to the unified inventory.


code:
Modpack - 3d Armor [0.4.13]
===========================

![](https://github.com/minetest-mods/3d_armor/workflows/luacheck/badge.svg)
![](https://github.com/minetest-mods/3d_armor/workflows/integration-test/badge.svg)

### Table of Contents
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->

- [[mod] Visible Player Armor [3d_armor]](#mod-visible-player-armor-3d_armor)
- [[mod] Visible Wielded Items [wieldview]](#mod-visible-wielded-items-wieldview)
- [[mod] Shields [shields]](#mod-shields-shields)
- [[mod] 3d Armor Stand [3d_armor_stand]](#mod-3d-armor-stand-3d_armor_stand)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

[mod] Visible Player Armor [3d_armor]
-------------------------------------

Minetest Version: 5.0.0

Game: minetest_game and many derivatives

Depends: default

Adds craftable armor that is visible to other players. Each armor item worn contributes to
a player's armor group level making them less vulnerable to attack.

Armor takes damage when a player is hurt, however, many armor items offer a 'stackable'
percentage chance of restoring the lost health points. Overall armor level is boosted by 10%
when wearing a full matching set (helmet, chestplate, leggings and boots of the same material)

Fire protection has been added by TenPlus1 and in use when ethereal mod is found and crystal
armor has been enabled.  each piece of armor offers 1 fire protection, level 1 protects
against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava.

Compatible with sfinv, inventory plus or unified inventory by enabling the appropriate
inventory module, [3d_armor_sfinv], [3d_armor_ip] and [3d_armor_ui] respectively.
Also compatible with [smart_inventory] without the need for additional modules.

built in support player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam
and [simple_skins] by TenPlus1.

Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory.
see armor.conf.example for all available options.

For mod installation instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods

[mod] Visible Wielded Items [wieldview]
---------------------------------------

Depends: 3d_armor

Makes hand wielded items visible to other players.

[mod] Shields [shields]
-----------------------

Depends: 3d_armor

Originally a part of 3d_armor, shields have been re-included as an optional extra.
If you do not want shields then simply remove the shields folder from the modpack.

[mod] 3d Armor Stand [3d_armor_stand]
-------------------------------------

Depends: 3d_armor

Adds a chest-like armor stand for armor storage and display.


code: Visible player armor & wielded items.


code:
#!/bin/sh
# simple integration test

CFG=/tmp/minetest.conf
MTDIR=/tmp/mt
WORLDDIR=${MTDIR}/worlds/world

cat <<EOF > ${CFG}
 enable_3d_armor_integration_test = true
EOF

mkdir -p ${WORLDDIR}
chmod 777 ${MTDIR} -R
docker run --rm -i \
	-v ${CFG}:/etc/minetest/minetest.conf:ro \
	-v ${MTDIR}:/var/lib/minetest/.minetest \
	-v $(pwd):/var/lib/minetest/.minetest/worlds/world/worldmods/3d_armor \
	registry.gitlab.com/minetest/minetest/server:5.2.0

test -f ${WORLDDIR}/integration_test.json && exit 0 || exit 1


code:
name = minetest-3d_armor
description = Visible player armor & wielded items.


code:
#!/usr/bin/python

import os
import sys
import Image

try :
	arg = sys.argv[1]
except IndexError :
	print "Usage: preview_gen.py <index_file>"
	sys.exit(1)

try :
	index = open(arg, "r")
except IOError :
	print "Failed to open index file%s" %s (arg)
	sys.exit(1)

preview = []

for line in index.readlines() :
	if ":" in line :
		line = line.rstrip('\n')
		preview.append(line.split(':'))

print "Generating preview images..."
for fn, place in preview :
	try :
		imi = Image.open(fn)
	except IOError :
		print "Failed to open %s" % (fn)
		sys.exit(1)

	w, h = imi.size
	if h != w / 2:
		print "Incompatible texture size %s" % (fn)
		sys.exit(1)

	s = w / 64
	imo = Image.new("RGBA", (16 * s, 32 * s))

	if place == "all" or place == "head" :
		face = (40 * s, 8 * s, 48 * s, 16 * s)
		side_l = (56 * s, 8 * s, 57 * s, 16 * s)
		side_r = (63 * s, 8 * s, 64 * s, 16 * s)
		imo.paste(imi.crop(side_l), (4 * s, 0, 5 * s, 8 * s))
		imo.paste(imi.crop(side_r), (11 * s, 0, 12 * s, 8 * s))
		imo.paste(imi.crop(face), (4 * s, 0, 12 * s, 8 * s))

	if place == "all" or place == "torso" :
		arm = (44 * s, 20 * s, 48 * s, 32 * s)
		body = (20 * s, 20 * s, 28 * s, 32 * s)
		imo.paste(imi.crop(arm), (0 * s, 8 * s, 4 * s, 20 * s))
		imo.paste(imi.crop(arm).transpose(Image.FLIP_LEFT_RIGHT),
				(12 * s, 8 * s, 16 * s, 20 * s))
		imo.paste(imi.crop(body), (4 * s, 8 * s, 12 * s, 20 * s))

	if place == "all" or place == "legs" :
		leg = (4 * s, 20 * s, 8 * s, 32 * s)
		imo.paste(imi.crop(leg), (4 * s, 20 * s, 8 * s, 32 * s))
		imo.paste(imi.crop(leg).transpose(Image.FLIP_LEFT_RIGHT),
				(8 * s, 20 * s, 12 * s, 32 * s))

	if place == "all" or place == "feet" :
		boot = (20 * s, 4 * s, 24 * s, 11 * s)
		imo.paste(imi.crop(boot), (4 * s, 25 * s, 8 * s, 32 * s))
		imo.paste(imi.crop(boot).transpose(Image.FLIP_LEFT_RIGHT),
				(8 * s, 25 * s, 12 * s, 32 * s))

	size = (32 * s, 64 * s)
	imo = imo.resize(size)

	if place == "shield" :
		shield = (0, 0, 16 * s, 16 * s)
		imo.paste(imi.crop(shield), (16 * s, 32 * s, 32 * s, 48 * s))

	outfile = fn.replace(".png", "_preview.png")
	imo.save(outfile)
	print outfile


code:
[3d_armor]

armor_material_wood (Enable wood armor) bool true
armor_material_cactus (Enable cactus armor) bool true
armor_material_steel (Enable steel armor) bool true
armor_material_bronze (Enable bronze armor) bool true
armor_material_diamond (Enable diamond armor) bool true
armor_material_gold (Enable gold armor) bool true
armor_material_mithril (Enable mithril armor) bool true
armor_material_crystal (Enable crystal armor) bool true

# Increase this if you get initialization glitches when a player first joins.
armor_init_delay (Initialization delay) int 2

# Number of initialization attempts.
# Use in conjunction with armor_init_delay if initialization problems persist.
armor_init_times (Initialization attempts) int 10

# Increase this if armor is not getting into bones due to server lag.
armor_bones_delay (Delay for bones) int 1

# How often player armor items are updated.
armor_update_time (Armor refresh rate [seconds]) int 1

# Drop armor when a player dies.
# Uses bones mod if present, otherwise items are dropped around the player.
armor_drop (Drop armor on death) bool true

# Pulverize armor when a player dies, overrides armor_drop.
armor_destroy (Pulverize armor on death) bool false

# You can use this to increase or decrease overall armor effectiveness,
# eg: level_multiplier = 0.5 will reduce armor level by half.
armor_level_multiplier (Armor effectiveness multiplier) float 1

# You can use this to increase or decrease overall armor healing,
# eg: armor_heal_multiplier = 0 will disable healing altogether.
armor_heal_multiplier (Armor healing multiplier) float 1

# Enable water protection (periodically restores breath when activated).
armor_water_protect (Enable water protection) bool true

# Enable fire protection (defaults true if using ethereal mod).
armor_fire_protect (Enable fire protection) bool false

# Enable punch damage effects.
armor_punch_damage (Enable damage effects) bool true

# Enable migration of old armor inventories.
armor_migrate_old_inventory (Migrate old armor inventories) bool true

[shields]

shields_disable_sounds (Disable shield sounds) bool false

[wieldview]

# Set number of seconds between visible wielded item updates.
wieldview_update_time (Wieldview refresh rate [seconds]) int 2

# Show nodes as tiles, disabled by default.
wieldview_node_tiles (Show nodes as tiles) bool false


code:
[mod] Shields [shields]
=======================

Adds shields to 3d_armor

Depends: 3d_armor

Originally a part of 3d_armor, shields have been re-included as an optional extra.
If you do not what shields then simply remove the shields folder from the modpack.

Shields Configuration
---------------------

Override the following default settings by adding them to your minetest.conf file.

shields_disable_sounds = false


code:
Shields -- Crafting Guide
--------------------------

+---+---+---+
| X | X | X |
+---+---+---+
| X | X | X |
+---+---+---+
|   | X |   |
+---+---+---+

[shields:shield_wood] X = [default:wood]
[shields:shield_cactus] X = [default:cactus]
[shields:shield_steel] X = [default:steel_ingot]
[shields:shield_bronze] X = [default:bronze_ingot]
[shields:shield_diamond] X = [default:diamond]
[shields:shield_gold] X = [default:gold_ingot]
[shields:shield_mithril] X = [moreores:mithril_ingot]
[shields:shield_crystal] X = [ethereal:crystal_ingot]

Enhanced Shields
----------------

+---+
| S |
+---+
| X |
+---+
| S |
+---+

[shields:shield_enhanced_wood] X = [shields:shield_wood]
[shields:shield_enhanced_cactus] X = [shields:shield_cactus]

S = [default:steel_ingot]


code:
default
3d_armor


code: Adds visible shields to 3d armor.


code:
-- support for i18n
local S = armor_i18n.gettext

local disable_sounds = minetest.settings:get_bool("shields_disable_sounds")
local function play_sound_effect(player, name)
	if not disable_sounds and player then
		local pos = player:get_pos()
		if pos then
			minetest.sound_play(name, {
				pos = pos,
				max_hear_distance = 10,
				gain = 0.5,
			})
		end
	end
end

if minetest.global_exists("armor") and armor.elements then
	table.insert(armor.elements, "shield")
	local mult = armor.config.level_multiplier or 1
	armor.config.level_multiplier = mult * 0.9
end

-- Regisiter Shields

armor:register_armor("shields:shield_admin", {
	description = S("Admin Shield"),
	inventory_image = "shields_inv_shield_admin.png",
	groups = {armor_shield=1000, armor_heal=100, armor_use=0, not_in_creative_inventory=1},
})

minetest.register_alias("adminshield", "shields:shield_admin")

if armor.materials.wood then
	armor:register_armor("shields:shield_wood", {
		description = S("Wooden Shield"),
		inventory_image = "shields_inv_shield_wood.png",
		groups = {armor_shield=1, armor_heal=0, armor_use=2000, flammable=1},
		armor_groups = {fleshy=5},
		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_wood_footstep")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_wood_footstep")
		end,
	})
	armor:register_armor("shields:shield_enhanced_wood", {
		description = S("Enhanced Wood Shield"),
		inventory_image = "shields_inv_shield_enhanced_wood.png",
		groups = {armor_shield=1, armor_heal=0, armor_use=2000},
		armor_groups = {fleshy=8},
		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=2},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_dig_metal")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_dug_metal")
		end,
	})
	minetest.register_craft({
		output = "shields:shield_enhanced_wood",
		recipe = {
			{"default:steel_ingot"},
			{"shields:shield_wood"},
			{"default:steel_ingot"},
		},
	})
	minetest.register_craft({
		type = "fuel",
		recipe = "shields:shield_wood",
		burntime = 8,
	})
end

if armor.materials.cactus then
	armor:register_armor("shields:shield_cactus", {
		description = S("Cactus Shield"),
		inventory_image = "shields_inv_shield_cactus.png",
		groups = {armor_shield=1, armor_heal=0, armor_use=1000},
		armor_groups = {fleshy=5},
		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_wood_footstep")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_wood_footstep")
		end,
	})
	armor:register_armor("shields:shield_enhanced_cactus", {
		description = S("Enhanced Cactus Shield"),
		inventory_image = "shields_inv_shield_enhanced_cactus.png",
		groups = {armor_shield=1, armor_heal=0, armor_use=1000},
		armor_groups = {fleshy=8},
		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=2},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_dig_metal")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_dug_metal")
		end,
	})
	minetest.register_craft({
		output = "shields:shield_enhanced_cactus",
		recipe = {
			{"default:steel_ingot"},
			{"shields:shield_cactus"},
			{"default:steel_ingot"},
		},
	})
	minetest.register_craft({
		type = "fuel",
		recipe = "shields:shield_cactus",
		burntime = 16,
	})
end

if armor.materials.steel then
	armor:register_armor("shields:shield_steel", {
		description = S("Steel Shield"),
		inventory_image = "shields_inv_shield_steel.png",
		groups = {armor_shield=1, armor_heal=0, armor_use=800,
			physics_speed=-0.03, physics_gravity=0.03},
		armor_groups = {fleshy=10},
		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_dig_metal")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_dug_metal")
		end,
	})
end

if armor.materials.bronze then
	armor:register_armor("shields:shield_bronze", {
		description = S("Bronze Shield"),
		inventory_image = "shields_inv_shield_bronze.png",
		groups = {armor_shield=1, armor_heal=6, armor_use=400,
			physics_speed=-0.03, physics_gravity=0.03},
		armor_groups = {fleshy=10},
		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_dig_metal")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_dug_metal")
		end,
	})
end

if armor.materials.diamond then
	armor:register_armor("shields:shield_diamond", {
		description = S("Diamond Shield"),
		inventory_image = "shields_inv_shield_diamond.png",
		groups = {armor_shield=1, armor_heal=12, armor_use=200},
		armor_groups = {fleshy=15},
		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_glass_footstep")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_break_glass")
		end,
	})
end

if armor.materials.gold then
	armor:register_armor("shields:shield_gold", {
		description = S("Gold Shield"),
		inventory_image = "shields_inv_shield_gold.png",
		groups = {armor_shield=1, armor_heal=6, armor_use=300,
			physics_speed=-0.04, physics_gravity=0.04},
		armor_groups = {fleshy=10},
		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_dig_metal")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_dug_metal")
		end,
	})
end

if armor.materials.mithril then
	armor:register_armor("shields:shield_mithril", {
		description = S("Mithril Shield"),
		inventory_image = "shields_inv_shield_mithril.png",
		groups = {armor_shield=1, armor_heal=12, armor_use=100},
		armor_groups = {fleshy=15},
		damage_groups = {cracky=2, snappy=1, level=3},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_glass_footstep")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_break_glass")
		end,
	})
end

if armor.materials.crystal then
	armor:register_armor("shields:shield_crystal", {
		description = S("Crystal Shield"),
		inventory_image = "shields_inv_shield_crystal.png",
		groups = {armor_shield=1, armor_heal=12, armor_use=100, armor_fire=1},
		armor_groups = {fleshy=15},
		damage_groups = {cracky=2, snappy=1, level=3},
		reciprocate_damage = true,
		on_damage = function(player, index, stack)
			play_sound_effect(player, "default_glass_footstep")
		end,
		on_destroy = function(player, index, stack)
			play_sound_effect(player, "default_break_glass")
		end,
	})
end

for k, v in pairs(armor.materials) do
	minetest.register_craft({
		output = "shields:shield_"..k,
		recipe = {
			{v, v, v},
			{v, v, v},
			{"", v, ""},
		},
	})
end


code:
name = shields
depends = default, 3d_armor
description = Adds visible shields to 3d armor.