New Upstream Snapshot - minetest-mod-3d-armor

Ready changes

Summary

Merged new upstream version: 0.4.14+git20221116.1.04b45de (was: 0.4.14).

Resulting package

Built on 2022-11-17T22:25 (took 9m0s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots minetest-mod-3d-armor

Lintian Result

Diff

diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml
deleted file mode 100644
index 1eeaa6a..0000000
--- a/.github/workflows/integration-test.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: integration-test
-
-on: [push]
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-
-    - name: integration-test
-      run: ./integration-test.sh
diff --git a/.github/workflows/luacheck.yml b/.github/workflows/luacheck.yml
deleted file mode 100644
index a03fe92..0000000
--- a/.github/workflows/luacheck.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-name: luacheck
-
-on: [push]
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - name: apt
-      run: sudo apt-get install -y luarocks
-    - name: luacheck install
-      run: luarocks install --local luacheck
-    - name: luacheck run
-      run: $HOME/.luarocks/bin/luacheck ./
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index ba96b08..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-## Generic ignorable patterns and files
-*~
-.*.swp
-*bak*
-tags
-*.vim
-armor.conf
-
-## Eclipse project files & directories
-.project
-.settings
diff --git a/.ldoc/config.ld b/.ldoc/config.ld
new file mode 100644
index 0000000..d24e58c
--- /dev/null
+++ b/.ldoc/config.ld
@@ -0,0 +1,335 @@
+
+-- place this file in mod ".ldoc" directory
+
+local print, type, string, table, tostring, tonumber, error, pairs, ipairs
+if import then
+	print = import("print")
+	type = import("type")
+	string = import("string")
+	table = import("table")
+	tostring = import("tostring")
+	tonumber = import("tonumber")
+	error = import("error")
+	pairs = import("pairs")
+	ipairs = import("ipairs")
+end
+
+project = "3d_armor"
+title = "3D Armor"
+format = "markdown"
+not_luadoc = true
+boilerplate = false
+wrap = false
+style = true
+favicon = "https://www.minetest.net/media/icon.svg"
+
+file = {
+	"3d_armor/api.lua",
+	".ldoc/settings.luadoc",
+	--".ldoc/armors.luadoc",
+	".ldoc/helmets.luadoc",
+	".ldoc/chestplates.luadoc",
+	".ldoc/leggings.luadoc",
+	".ldoc/boots.luadoc",
+	--".ldoc/shields.luadoc",
+	"shields/init.lua",
+	".ldoc/crafting.luadoc",
+}
+
+
+new_type("setting", "Settings")
+new_type("armor", "Armors")
+new_type("craft", "Craft Recipes")
+
+alias("helmet", "armor")
+alias("chestplate", "armor")
+alias("leggings", "armor")
+alias("boots", "armor")
+alias("shield", "armor")
+alias("grp", "group")
+
+-- function declarations
+local format_text
+local format_group
+
+custom_tags = {
+	-- settings
+	{
+		"settype",
+		title = "Type",
+		hidden = true,
+	},
+	{
+		"min",
+		title = "Minimum Value",
+		hidden = true,
+	},
+	{
+		"max",
+		title = "Maximum Value",
+		hidden = true,
+	},
+	{
+		"default",
+		title = "Default Value",
+		hidden = true,
+	},
+	-- craft items/tools
+	{
+		-- specify image basename only
+		"img",
+		title = "Inventory Image",
+		format = function(value)
+			return "<img src=\"../data/" .. value .. "\" style=\"width:32px; height:32px;\" />"
+		end,
+	},
+	{
+		-- specify full (relative or absolute) image path
+		"image",
+		title = "Image",
+		format = function(value)
+			return "<img src=\"" .. value .. "\" style=\"width:32px; height:32px;\" />"
+		end,
+	},
+	{
+		"group",
+		title = "Groups",
+		format = function(value)
+			return format_group(value)
+		end,
+	},
+	{
+		"armorgrp",
+		title = "Armor Groups",
+		format = function(value)
+			return format_group(value)
+		end,
+	},
+	{
+		"damagegrp",
+		title = "Damage Groups",
+		format = function(value)
+			return format_group(value)
+		end,
+	},
+}
+
+
+if string then
+	string.trim = function(st, delim)
+		if not delim then
+			delim = " "
+		end
+
+		while string.find(st, delim) == 1 do
+			st = st:sub(2)
+		end
+
+		while string.sub(st, string.len(st)) == delim do
+			st = st:sub(1, string.len(st)-1)
+		end
+
+		return st
+	end
+
+	string.split = function(st, delim)
+		local list = {}
+
+		local idx = string.find(st, delim)
+		while idx do
+			table.insert(list, st:sub(1, idx-1))
+			st = st:sub(idx+1)
+			idx = string.find(st, delim)
+		end
+		-- add remaining item
+		table.insert(list, st)
+
+		return list
+	end
+end
+
+if table then
+	if not table.copy then
+		table.copy = function(orig_table)
+			local new_table = {}
+			for k, v in pairs(orig_table) do
+				new_table[k] = v
+			end
+
+			return new_table
+		end
+	end
+end
+
+format_text = function(text, flags)
+	local ret = "<"
+	local ttype = "span"
+	if flags.code then
+		ttype = "code"
+	end
+
+	ret = ret .. ttype .. " style=\""
+
+	if flags.size then
+		ret = ret .. "font-size:" .. flags.size .. ";"
+	end
+	if flags.mono then
+		ret = ret .. "font-family:monospace;"
+	end
+	if flags.italic then
+		ret = ret .. "font-style:italic;"
+	end
+	if flags.bold then
+		ret = ret .. "font-weight:bold;"
+	end
+	if flags.color then
+		ret = ret .. "color:" .. flags.color .. ";"
+	end
+	if flags.bgcolor then
+		ret = ret .. "background-color:" .. flags.bgcolor .. ";"
+	end
+
+	ret = ret .. "\">" .. text .. "</" .. ttype .. ">"
+
+	return ret
+end
+
+format_group = function(text)
+	if string then
+		local idx, k, v = string.find(text, " ")
+		if idx then
+			text = format_text(string.sub(text, 1, idx-1) .. ": ", {mono=true, color="darkgreen"})
+				.. string.sub(text, idx)
+		end
+	end
+
+	return text
+end
+
+
+local function format_setting_tag(desc, value)
+	return "\n- <span style=\"font-size:80%;\">`" .. desc .. ":`</span> `" .. value .. "`"
+end
+
+
+local registered = {
+	settings = {},
+}
+
+local function setting_handler(item)
+	-- avoid parsing again
+	if registered.settings[item.name] then
+		return item
+	end
+
+	if not ipairs or not type then
+		return item
+	end
+
+	local tags = {
+		{"settype", "type"},
+		{"default"},
+		{"min", "minimum value"},
+		{"max", "maximum value"},
+	}
+
+	local def = {
+		["settype"] = format_setting_tag("type", "string"),
+	}
+
+	for _, t in ipairs(tags) do
+		local name = t[1]
+		local desc = t[2]
+		if not desc then desc = name end
+
+		local value = item.tags[name]
+		if type(value) == "table" then
+			if #value > 1 then
+				local msg = item.file.filename .. " (line " .. item.lineno
+					.. "): multiple instances of tag \"" .. name .. "\" found"
+				if error then
+					error(msg)
+				elseif print then
+					print("WARNING: " .. msg)
+				end
+			end
+
+			if value[1] then
+				def[name] = format_setting_tag(desc, value[1])
+			end
+		end
+	end
+
+	item.description = item.description .. "\n\n**Definition:**\n" .. def.settype
+	for _, t in ipairs({def.default, def.min, def.max}) do
+		if t then
+			item.description = item.description .. t
+		end
+	end
+
+	registered.settings[item.name] = true
+
+	return item
+end
+
+function custom_display_name_handler(item, default_handler)
+	if item.type == "setting" then
+		item = setting_handler(item)
+	end
+
+	if item then
+		return default_handler(item)
+	end
+end
+
+
+local custom_see_links = {
+	["ObjectRef"] = "https://minetest.gitlab.io/minetest/class-reference/#objectref",
+	["PlayerMetaRef"] = "https://minetest.gitlab.io/minetest/class-reference/#playermetaref",
+	["ItemDef"] = "https://minetest.gitlab.io/minetest/definition-tables/#item-definition",
+	["ItemStack"] = "https://minetest.gitlab.io/minetest/class-reference/#itemstack",
+	["groups"] = "https://minetest.gitlab.io/minetest/groups/",
+	["entity_damage_mechanism"] = "https://minetest.gitlab.io/minetest/entity-damage-mechanism/",
+	["vector"] = "https://minetest.gitlab.io/minetest/representations-of-simple-things/#positionvector",
+}
+
+local function format_custom_see(name, section)
+	local url = custom_see_links[name]
+	if not url then
+		url = ""
+	end
+
+	if not name then
+		name = ""
+	end
+
+	return name, url
+end
+
+custom_see_handler("^(ObjectRef)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(PlayerMetaRef)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(ItemDef)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(groups)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(entity_damage_mechanism)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(ItemStack)$", function(name, section)
+	return format_custom_see(name, section)
+end)
+
+custom_see_handler("^(vector)$", function(name, section)
+	return name, "https://minetest.gitlab.io/minetest/representations-of-simple-things/#positionvector"
+end)
diff --git a/.ldoc/crafting.luadoc b/.ldoc/crafting.luadoc
new file mode 100644
index 0000000..7f24674
--- /dev/null
+++ b/.ldoc/crafting.luadoc
@@ -0,0 +1,39 @@
+
+--- 3D Armor Crafting
+--
+--  @topic crafting
+
+
+--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+--
+--  @craft armor
+--  @usage
+--  Key:
+--  - m: material
+--    - wood:    group:wood
+--    - cactus:  default:cactus
+--    - steel:   default:steel_ingot
+--    - bronze:  default:bronze_ingot
+--    - diamond: default:diamond
+--    - gold:    default:gold_ingot
+--    - mithril: moreores:mithril_ingot
+--    - crystal: ethereal:crystal_ingot
+--    - nether:  nether:nether_ingot
+--
+--  helmet:        chestplate:    leggings:
+--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+--
+--  boots:         shield:
+--  ┌───┬───┬───┐  ┌───┬───┬───┐
+--  │   │   │   │  │ m │ m │ m │
+--  ├───┼───┼───┤  ├───┼───┼───┤
+--  │ m │   │ m │  │ m │ m │ m │
+--  ├───┼───┼───┤  ├───┼───┼───┤
+--  │ m │   │ m │  │   │ m │   │
+--  └───┴───┴───┘  └───┴───┴───┘
diff --git a/.ldoc/gendoc.sh b/.ldoc/gendoc.sh
new file mode 100755
index 0000000..886137b
--- /dev/null
+++ b/.ldoc/gendoc.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+
+# Place this file in mod ".ldoc" directory.
+#
+# To change output directory set the `d_export` environment variable.
+# Example:
+#   $ d_export=/custom/path ./gendoc.sh
+
+
+d_ldoc="$(dirname $(readlink -f $0))"
+f_config="${d_ldoc}/config.ld"
+
+cd "${d_ldoc}/.."
+
+d_root="$(pwd)"
+d_export="${d_export:-${d_root}/3d_armor/docs/reference}"
+d_data="${d_export}/data"
+
+cmd_ldoc="${d_ldoc}/ldoc/ldoc.lua"
+if test -f "${cmd_ldoc}"; then
+	if test ! -x "${cmd_ldoc}"; then
+		chmod +x "${cmd_ldoc}"
+	fi
+else
+	cmd_ldoc="ldoc"
+fi
+
+
+# clean old files
+rm -rf "${d_export}"
+
+# generate items, settings, & crafts topics temp files
+echo -e "\ngenerating temp files ..."
+for script in src settings; do
+	script="${d_ldoc}/parse_${script}.py"
+	if test ! -f "${script}"; then
+		echo "ERROR: script doesn't exist: ${script}"
+	else
+		# check script's executable bit
+		if test ! -x "${script}"; then
+			chmod +x "${script}"
+		fi
+		# execute script
+		"${script}"
+	fi
+done
+
+echo
+
+# generate new doc files
+"${cmd_ldoc}" --UNSAFE_NO_SANDBOX -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$?
+
+# check exit status
+if test ${retval} -ne 0; then
+	echo -e "\nan error occurred (ldoc return code: ${retval})"
+	exit ${retval}
+fi
+
+echo -e "\ncleaning temp files ..."
+find "${d_ldoc}" -type f -name "*.luadoc" ! -name "crafting.luadoc" -exec rm -vf {} +
+
+# HACK: ldoc does not seem to like the "shields:" prefix
+echo -e "\ncompensating for LDoc's issue with \"shields:\" prefix ..."
+sed -i \
+	-e 's/<strong>shield_/<strong>shields:shield_/' \
+	-e 's/<td class="name\(.*\)>shield_/<td class="name\1>shields:shield_/' \
+	-e 's/<a href="#shield_/<a href="#shields:shield_/' \
+	-e 's/<a name.*"shield_/<a name="shields:shield_/' \
+	"${d_export}/topics/shields.html"
+
+# copy textures to data directory
+printf "\ncopying textures ..."
+mkdir -p "${d_data}"
+texture_count=0
+for d_mod in armor_* shields; do
+	printf "\rcopying textures from ${d_mod} ...\n"
+	for png in $(find "${d_root}/${d_mod}/textures" -maxdepth 1 -type f -name "*.png"); do
+		if test -f "${d_data}/$(basename ${png})"; then
+			echo "WARNING: not overwriting existing file: ${png}"
+		else
+			cp "${png}" "${d_data}"
+			texture_count=$((texture_count + 1))
+			printf "\rcopied ${texture_count} textures"
+		fi
+	done
+done
+
+echo -e "\n\nDone!"
diff --git a/.ldoc/ldoc.css b/.ldoc/ldoc.css
new file mode 100644
index 0000000..946e8dd
--- /dev/null
+++ b/.ldoc/ldoc.css
@@ -0,0 +1,305 @@
+/* BEGIN RESET
+
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 2.8.2r1
+*/
+html {
+    color: #000;
+    background: #FFF;
+}
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td {
+    margin: 0;
+    padding: 0;
+}
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+}
+fieldset,img {
+    border: 0;
+}
+address,caption,cite,code,dfn,em,strong,th,var,optgroup {
+    font-style: inherit;
+    font-weight: inherit;
+}
+del,ins {
+    text-decoration: none;
+}
+li {
+    margin-left: 20px;
+}
+caption,th {
+    text-align: left;
+}
+h1,h2,h3,h4,h5,h6 {
+    font-size: 100%;
+    font-weight: bold;
+}
+q:before,q:after {
+    content: '';
+}
+abbr,acronym {
+    border: 0;
+    font-variant: normal;
+}
+sup {
+    vertical-align: baseline;
+}
+sub {
+    vertical-align: baseline;
+}
+legend {
+    color: #000;
+}
+input,button,textarea,select,optgroup,option {
+    font-family: inherit;
+    font-size: inherit;
+    font-style: inherit;
+    font-weight: inherit;
+}
+input,button,textarea,select {*font-size:100%;
+}
+/* END RESET */
+
+body {
+    margin-left: 1em;
+    margin-right: 1em;
+    font-family: arial, helvetica, geneva, sans-serif;
+    background-color: #ffffff; margin: 0px;
+}
+
+code, tt { font-family: monospace; font-size: 1.1em; }
+span.parameter { font-family:monospace; }
+span.parameter:after { content:":"; }
+span.types:before { content:"("; }
+span.types:after { content:")"; }
+.type { font-weight: bold; font-style:italic }
+
+body, p, td, th { font-size: .95em; line-height: 1.2em;}
+
+p, ul { margin: 10px 0 0 0px;}
+
+strong { font-weight: bold;}
+
+em { font-style: italic;}
+
+h1 {
+    font-size: 1.5em;
+    margin: 20px 0 20px 0;
+}
+h2, h3, h4 { margin: 15px 0 10px 0; }
+h2 { font-size: 1.25em; }
+h3 { font-size: 1.15em; }
+h4 { font-size: 1.06em; }
+
+a:link { font-weight: bold; color: #004080; text-decoration: none; }
+a:visited { font-weight: bold; color: #006699; text-decoration: none; }
+a:link:hover { text-decoration: underline; }
+
+hr {
+    color:#cccccc;
+    background: #00007f;
+    height: 1px;
+}
+
+blockquote { margin-left: 3em; }
+
+ul { list-style-type: disc; }
+
+p.name {
+    font-family: "Andale Mono", monospace;
+    padding-top: 1em;
+}
+
+pre {
+    background-color: rgb(245, 245, 245);
+    border: 1px solid #C0C0C0; /* silver */
+    padding: 10px;
+    margin: 10px 0 10px 0;
+    overflow: auto;
+    font-family: "Andale Mono", monospace;
+}
+
+pre.example {
+    font-size: .85em;
+}
+
+table.index { border: 1px #00007f; }
+table.index td { text-align: left; vertical-align: top; }
+
+#container {
+    margin-left: 1em;
+    margin-right: 1em;
+    background-color: #f0f0f0;
+}
+
+#product {
+    text-align: center;
+    border-bottom: 1px solid #cccccc;
+    background-color: #ffffff;
+}
+
+#product big {
+    font-size: 2em;
+}
+
+#main {
+    background-color: #f0f0f0;
+    border-left: 2px solid #cccccc;
+}
+
+#navigation {
+    float: left;
+    width: 14em;
+    vertical-align: top;
+    background-color: #f0f0f0;
+    overflow: visible;
+    position: fixed;
+}
+
+#navigation h2 {
+    background-color:#e7e7e7;
+    font-size:1.1em;
+    color:#000000;
+    text-align: left;
+    padding:0.2em;
+    border-top:1px solid #dddddd;
+    border-bottom:1px solid #dddddd;
+}
+
+#navigation ul
+{
+    font-size:1em;
+    list-style-type: none;
+    margin: 1px 1px 10px 1px;
+}
+
+#navigation li {
+    text-indent: -1em;
+    display: block;
+    margin: 3px 0px 0px 22px;
+}
+
+#navigation li li a {
+    margin: 0px 3px 0px -1em;
+}
+
+#content {
+    margin-left: 14em;
+    padding: 1em;
+    width: 700px;
+    border-left: 2px solid #cccccc;
+    border-right: 2px solid #cccccc;
+    background-color: #ffffff;
+    min-height: 425px;
+}
+
+#about {
+    clear: both;
+    padding: 5px;
+    border-top: 2px solid #cccccc;
+    background-color: #ffffff;
+}
+
+@media print {
+    body {
+        font: 12pt "Times New Roman", "TimeNR", Times, serif;
+    }
+    a { font-weight: bold; color: #004080; text-decoration: underline; }
+
+    #main {
+        background-color: #ffffff;
+        border-left: 0px;
+    }
+
+    #container {
+        margin-left: 2%;
+        margin-right: 2%;
+        background-color: #ffffff;
+    }
+
+    #content {
+        padding: 1em;
+        background-color: #ffffff;
+    }
+
+    #navigation {
+        display: none;
+    }
+    pre.example {
+        font-family: "Andale Mono", monospace;
+        font-size: 10pt;
+        page-break-inside: avoid;
+    }
+}
+
+table.module_list {
+    border-width: 1px;
+    border-style: solid;
+    border-color: #cccccc;
+    border-collapse: collapse;
+}
+table.module_list td {
+    border-width: 1px;
+    padding: 3px;
+    border-style: solid;
+    border-color: #cccccc;
+}
+table.module_list td.name { background-color: #f0f0f0; min-width: 200px; }
+table.module_list td.summary { width: 100%; }
+
+
+table.function_list {
+    border-width: 1px;
+    border-style: solid;
+    border-color: #cccccc;
+    border-collapse: collapse;
+}
+table.function_list td {
+    border-width: 1px;
+    padding: 3px;
+    border-style: solid;
+    border-color: #cccccc;
+}
+table.function_list td.name { background-color: #f0f0f0; min-width: 200px; }
+table.function_list td.summary { width: 100%; }
+
+ul.nowrap {
+    overflow:auto;
+    white-space:nowrap;
+}
+
+dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
+dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;}
+dl.table h3, dl.function h3 {font-size: .95em;}
+
+/* stop sublists from having initial vertical space */
+ul ul { margin-top: 0px; }
+ol ul { margin-top: 0px; }
+ol ol { margin-top: 0px; }
+ul ol { margin-top: 0px; }
+
+/* make the target distinct; helps when we're navigating to a function */
+a:target + * {
+  background-color: #FF9;
+}
+
+
+/* styles for prettification of source */
+pre .comment { color: #558817; }
+pre .constant { color: #a8660d; }
+pre .escape { color: #844631; }
+pre .keyword { color: #aa5050; font-weight: bold; }
+pre .library { color: #0e7c6b; }
+pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; }
+pre .string { color: #8080ff; }
+pre .number { color: #f8660d; }
+pre .operator { color: #2239a8; font-weight: bold; }
+pre .preprocessor, pre .prepro { color: #a33243; }
+pre .global { color: #800080; }
+pre .user-keyword { color: #800080; }
+pre .prompt { color: #558817; }
+pre .url { color: #272fc2; text-decoration: underline; }
+
diff --git a/.ldoc/parse_settings.py b/.ldoc/parse_settings.py
new file mode 100755
index 0000000..7e11ead
--- /dev/null
+++ b/.ldoc/parse_settings.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+# This script will format "settingtypes.txt" file found at the root
+# of 3d_armor modpack into a format readable by LDoc.
+
+import sys, os, errno, codecs
+
+
+path = os.path.realpath(__file__)
+script = os.path.basename(path)
+d_root = os.path.dirname(os.path.dirname(path))
+d_ldoc = os.path.join(d_root, ".ldoc")
+f_settings = os.path.join(d_root, "settingtypes.txt")
+
+if not os.path.isfile(f_settings):
+	print("settingtypes.txt does not exist")
+	sys.exit(errno.ENOENT)
+
+i_stream = codecs.open(f_settings, "r", "utf-8")
+data_in = i_stream.read()
+i_stream.close()
+
+data_in = data_in.replace("\r", "")
+
+sets = data_in.split("\n\n")
+
+for idx in reversed(range(len(sets))):
+	set = sets[idx]
+	lines = set.split("\n")
+	for idx2 in reversed(range(len(lines))):
+		li = lines[idx2].strip(" \t")
+		if li == "" or li[0] == "[":
+			lines.pop(idx2)
+
+	if len(lines) == 0:
+		sets.pop(idx)
+	else:
+		sets[idx] = "\n".join(lines)
+
+filtered = []
+
+for set in sets:
+	comment = False
+	lines = set.split("\n")
+	new_lines = []
+	for li in lines:
+		if li[0] == "#":
+			new_lines.append(li)
+		else:
+			new_lines.append(li)
+			filtered.append("\n".join(new_lines))
+			new_lines = []
+
+settings = []
+
+def parse_setting(set):
+	desc = []
+	setting = summary = stype = sdefault = soptions = None
+
+	for li in set.split("\n"):
+		if li[0] == "#":
+			desc.append("--  {}".format(li.lstrip(" #")))
+		else:
+			setting = li.split(" ")[0]
+			summary = li.split(")")[0].split("(")[-1]
+			li = li.split(")")[-1].strip()
+			rem = li.split(" ")
+			stype = rem[0]
+			rem.pop(0)
+
+			if len(rem) > 0:
+				sdefault = rem[0]
+				rem.pop(0)
+
+			if len(rem) > 0:
+				soptions = " ".join(rem)
+
+	if not setting:
+		return
+
+	st = "---"
+	if summary:
+		if summary[-1] != ".":
+			summary = "{}.".format(summary)
+		st = "{} {}".format(st, summary)
+
+	st = "{}\n--".format(st)
+
+	if len(desc) > 0:
+		st = "{}\n{}\n--".format(st, "\n".join(desc))
+
+	st = "{}\n--  @setting {}".format(st, setting)
+
+	if stype:
+		st = "{}\n--  @settype {}".format(st, stype)
+
+	if sdefault:
+		st = "{}\n--  @default {}".format(st, sdefault)
+
+	# TODO: add options
+
+	settings.append(st)
+
+for f in filtered:
+	parse_setting(f)
+
+outfile = os.path.join(d_ldoc, "settings.luadoc")
+data_out = "\n--- 3D Armor Settings\n--\n--  @topic settings\n\n\n{}\n".format("\n\n".join(settings))
+
+o_stream = codecs.open(outfile, "w", "utf-8")
+if not o_stream:
+	print("ERROR: could not open file for writing: {}".format(outfile))
+	sys.exit(errno.EIO)
+
+o_stream.write(data_out)
+o_stream.close()
+
+print("settings exported to\t{}".format(outfile))
diff --git a/.ldoc/parse_src.py b/.ldoc/parse_src.py
new file mode 100755
index 0000000..c29c333
--- /dev/null
+++ b/.ldoc/parse_src.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+
+# This script will parse source files for docstring.
+
+import os, codecs
+
+
+path = os.path.realpath(__file__)
+script = os.path.basename(path)
+d_root = os.path.dirname(os.path.dirname(path))
+d_ldoc = os.path.join(d_root, ".ldoc")
+
+
+armor_types = {
+	"armor": {"topic": "Armors", "values": []},
+	"helmet": {"topic": "Helmets", "values": []},
+	"chestplate": {"topic": "Chestplates", "values": []},
+	"leggings": {"topic": "Leggings", "values": []},
+	"boots": {"topic": "Boots", "values": []},
+	#"shield": {"topic": "Shields", "values": []},
+}
+
+def parse_file(f):
+	buffer = codecs.open(f, "r", "utf-8")
+	if not buffer:
+		print("ERROR: could not open file for reading: {}".format(f))
+		return
+
+	data_in = buffer.read()
+	buffer.close()
+
+	# format to LF (Unix)
+	data_in = data_in.replace("\r\n", "\n").replace("\r", "\n")
+
+	current_item = []
+	item_type = None
+	new_item = False
+	for li in data_in.split("\n"):
+		li = li.strip()
+		if li.startswith("---"):
+			new_item = True
+		elif not li.startswith("--"):
+			new_item = False
+
+		if new_item:
+			current_item.append(li)
+			if not item_type:
+				for a_type in armor_types:
+					if "@{} ".format(a_type) in li:
+						item_type = a_type
+						break
+		elif item_type and len(current_item):
+			armor_types[item_type]["values"].append("\n".join(current_item))
+			item_type = None
+			current_item = []
+		else:
+			current_item = []
+
+to_parse = []
+
+for obj in os.listdir(d_root):
+	fullpath = os.path.join(d_root, obj)
+	if not obj.startswith(".") and os.path.isdir(fullpath):
+		for root, dirs, files in os.walk(fullpath):
+			for f in files:
+				if f.endswith(".lua"):
+					to_parse.append(os.path.join(root, f))
+
+for p in to_parse:
+	if not os.path.isfile(p):
+		print("ERROR: {} is not a file".format(p))
+	else:
+		parse_file(p)
+
+for t in armor_types:
+	topic = armor_types[t]["topic"]
+	items = armor_types[t]["values"]
+
+	if len(items):
+		outfile = os.path.join(d_ldoc, "{}.luadoc".format(topic.lower()))
+
+		buffer = codecs.open(outfile, "w", "utf-8")
+		if not buffer:
+			print("ERROR: could not open file for writing: {}".format(outfile))
+			continue
+
+		buffer.write("\n--- 3D Armor {}\n--\n--  @topic {}\n\n\n{}\n".format(topic, topic.lower(), "\n\n".join(items)))
+		buffer.close()
+
+		print("{} exported to\t{}".format(topic.lower(), outfile))
diff --git a/.luacheckrc b/.luacheckrc
index b01ed8e..6b769d6 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -4,7 +4,6 @@ unused_args = false
 globals = {
 	"wieldview",
 	"armor",
-	"armor_i18n",
 	"inventory_plus"
 }
 
@@ -19,9 +18,9 @@ read_globals = {
 
 	-- deps
 	"default",
+	"player_api",
 	"minetest",
 	"unified_inventory",
-	"intllib",
 	"wardrobe",
 	"player_monoids",
 	"armor_monoid",
diff --git a/3d_armor/README.md b/3d_armor/README.md
new file mode 100644
index 0000000..d36c9d4
--- /dev/null
+++ b/3d_armor/README.md
@@ -0,0 +1,530 @@
+# [mod] Visible Player Armor [3d_armor]
+
+|  |  |  |  | 
+|--|--|--|--|
+|-[Overview](#overview)                                                     |||-[API](#api)
+|-[Armor Configuration](#armor-configuration)                               |||- - [3d_Armor Item Storage](#3d_armor-item-storage)
+|- - [disable_specific_materials](#to-disable-individual-armor-materials)   |||- - [Armor Registration](#armor-registration)
+|- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups)
+|- - [armor_init_times](#number-of-initialization-attempts)                 |||- - [Groups used by 3d_Armor](#groups-used-by-3d_armor)
+|- - [armor_bones_delay](#armor-not-in-bones-due-to-server-lag)             |||- - - [Elements](#elements)
+|- - [armor_update_time](#how-often-player-armor-items-are-updated)         |||- - - [Attributes](#attributes)
+|- - [armor_drop](#drop-armor-when-a-player-dies)                           |||- - - [Physics](#physics)
+|- - [armor_destroy](#destroy-armor-when-a-player-dies)                     |||- - - [Durability](#durability)
+|- - [armor_level_multiplier](#armor-level-multiplyer)                      |||- - - [Armor Material](#armor-material)
+|- - [armor_heal_multiplier](#armor-healing-multiplyer)                     |||- - [Armour Functions](#armor-functions)
+|- - [armor_set_elements](#allows-the-customisation-of-armor-set)           |||- - - [armor:set_player_armor](#armor-set_player_armor)
+|- - [armor_set_bonus](#armor-set-bonus-multiplier)                         |||- - - [armor:punch](#armor-punch)
+|- - [armor_water_protect](#enable-water-protection)                        |||- - - [armor:damage](#armor-damage)
+|- - [armor_fire_protect](#enable-fire-protection)                          |||- - - [armor:remove_all](#armor-remove_all)
+|- - [armor_punch_damage](#enable-punch-damage-effects)                     |||- - - [armor:equip](#armor-equip)
+|- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories)     |||- - - [armor:unequip](#armor-unequip)
+|- - [wieldview_update_time](#how-often-player-wield-items-are-updated)     |||- - - [armor:update_skin](#armor-update_skin)
+|-[Credits](#credits)                                                       |||- - [Callbacks](#Callbacks)
+|                                                                           |||- - - [Item callbacks](#item-callbacks)
+|                                                                           |||- - - [Global callbacks](#global-callbacks)
+
+# Overview
+
+**Depends:** default
+
+**Recommends:** sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts)
+
+**Supports:** player_monoids, armor_monoid and POVA
+
+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 weapons.
+
+Armor takes damage when a player is hurt but also offers a percentage chance of healing.
+Overall level is boosted by 10% when wearing a full matching set.
+
+# Armor Configuration
+
+Change the following default settings by going to Main Menu>>Settings(Tab)>>All Settings(Button)>>Mods>>minetest-3d_Armor>>3d_Armor
+
+### To disable individual armor materials
+ **set the below to false**
+
+    armor_material_wood = true
+    armor_material_cactus = true
+    armor_material_steel = true
+    armor_material_bronze = true
+    armor_material_diamond = true
+    armor_material_gold = true
+    armor_material_mithril = true
+    armor_material_crystal = true
+    armor_material_nether = true
+
+### Initialization glitches when a player first joins
+ **Increase to prevent glitches**
+ 
+    armor_init_delay = 2
+
+### Number of initialization attempts
+ **Increase to prevent glitches - Use in conjunction with armor_init_delay if initialization problems persist.**
+
+    armor_init_times = 10
+
+### Armor not in bones due to server lag
+ **Increase to help resolve**
+ 
+    armor_bones_delay = 1
+
+### How often player armor items are updated
+**Number represents how often per second update is performed, higher value means less performance hit for servers but armor items maybe delayed in updating when switching.Fractional seconds also supported eg 0.1**
+
+    armor_update_time = 1
+	
+### Drop armor when a player dies
+ **Uses bones mod if present, otherwise items are dropped around the player when false.**
+
+    armor_drop = true
+
+### Destroy armor when a player dies
+ **overrides armor_drop.**
+
+    armor_destroy = false
+
+### Armor level multiplyer
+ **Increase to make armor more effective and decrease to make armor less effective**
+ **eg: level_multiplier = 0.5 will reduce armor level by half.**
+
+    armor_level_multiplier = 1
+
+### Armor healing multiplyer
+ **Increase to make armor healing more effective and decrease to make healing less effective**
+ **eg: armor_heal_multiplier = 0 will disable healing altogether.**
+
+    armor_heal_multiplier = 1
+	
+### Allows the customisation of armor set 
+ **Shields already configured as need to be worn to complete an armor set**   
+ **These names come from [Element names](#groups-used-by-3d_armor), the second half of the element name only is used eg armor_head is head**
+ 
+    armor_set_elements = head torso legs feet shield
+
+### Armor set bonus multiplier 
+ **Set to 1 to disable set bonus**
+ 
+    armor_set_multiplier = 1.1
+
+### Enable water protection
+ **periodically restores breath when activated**
+
+    armor_water_protect = true
+
+### Enable fire protection 
+**defaults to true if using ethereal mod**
+
+    armor_fire_protect = false
+	
+### Fire protection enabled, disable torch fire damage 
+**when fire protection is enabled allows you to disable fire damage from torches**
+**defaults to true if using ethereal mod**
+
+    armor_fire_protect_torch = false
+
+### Enable punch damage effects
+
+    armor_punch_damage = true
+
+### Migration of old armor inventories
+
+    armor_migrate_old_inventory = true
+	
+### How often player wield items are updated
+**Number represents how often per second update is performed, higher value means less performance hit for servers but wield items maybe delayed in updating when switching. Fractional seconds also supported eg 0.1**   
+***Note this is MT engine functionality but included for completness***
+
+    wieldview_update_time = 1
+
+# API
+
+## 3d_Armor item storage
+3d_Armor stores each armor piece a player currently has equiped in a ***detached*** inventory. The easiest way to access this inventory if needed is using this line of code
+
+	local _, armor_inv = armor:get_valid_player(player, "3d_armor")
+
+**Example** 
+
+	armor:register_on_equip(function(player, index, stack)
+		local _, armor_inv = armor:get_valid_player(player, "3d_armor")
+			for i = 1, 6 do
+				local stack = armor_inv:get_stack("armor", i)
+					if stack:get_name() == "3d_armor:chestplate_gold" then
+						minetest.chat_send_player(player:get_player_name(),"Got to love the Bling!!!")
+					end
+			end
+	end)
+
+## Armor Registration
+
+    armor:register_armor(name, def)
+
+Wrapper function for `minetest.register_tool`, which enables the easy registration of new armor items. While registering armor as a tool item is still supported, this may be deprecated in future so all armor items should be registered using *armor:register_armor(name,def)*.
+
+### Additional fields supported by 3d_armor
+
+	texture = <filename>
+	preview = <filename>
+	armor_groups = <table>
+	damage_groups = <table>
+	reciprocate_damage = <bool>
+	on_equip = <function>
+	on_unequip = <function>
+	on_destroy = <function>
+	on_damage = <function>
+	on_punched = <function>
+
+***Reciprocal tool*** damage will apply damage back onto the attacking tool/weapon, however this will only be done by the first armor inventory item with `reciprocate_damage = true`, damage does not stack.
+ 
+**Example Simple:**
+
+    armor:register_armor("mod_name:chestplate_leather", {
+    	description = "Leather Chestplate",
+    	inventory_image = "mod_name_inv_chestplate_leather.png",
+    	texture = "mod_name_leather_chestplate.png",
+    	preview = "mod_name_leather_chestplate_preview.png",
+    	groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1},
+    	armor_groups = {fleshy=10},
+    	damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}
+    })
+*See ***armor.lua*** under **3d_armor>>3d_armor** for further examples*
+
+**Extended functionality**   
+The values for ***texture*** and ***preview*** do not need to be included when registering armor if they follow the naming convention in the textures mod folder of:   
+***texture:*** *mod_name_leather_chestplate.png*   
+***preview:*** *mod_name_leather_chestplate_preview.png*
+
+## Registering Armor Groups
+3d armor has a built in armor group which is ***fleshy*** all players base vulnerability to being fleshy is ***100***. 
+ 3d armour allows for the easy registration/addition of new armor groups::
+
+    armor:register_armor_group(group, base)
+    
+***group:*** Is the name of the new armor group 
+***base*** Is the starting vulnerability that all players have to that new group. This dosent need to be 100.
+
+**Example**
+
+    armor:register_armor_group("radiation", 100)
+
+New armor group is registered called *radiation* and all players start off with a base vulnerability of *100* to radiation.
+
+**Example** *Showing armor reg, new group usage and custom function*
+
+    armor:register_armor("mod_name:speed_boots", {
+    	description = "Speed Boots",
+    	inventory_image = "mod_name_speed_boots_inv.png",
+    	texture = "mod_name_speed_boots.png",
+    	preview = "mod_name_speed_boots_preview.png",
+    	groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1},
+    	armor_groups = {fleshy=10, radiation=10},
+    	damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1},
+    	reciprocate_damage = true,
+    	on_destroy = function(player, index, stack)
+    		local pos = player:get_pos()
+    		if pos then
+    			minetest.sound_play({
+    				name = "mod_name_break_sound",
+    				pos = pos,
+    				gain = 0.5,
+    			})
+    		end
+    	end,
+    })
+
+### Tools/weapons and new armor groups
+The above allows armor to block/prevent new damage types but you also need to assign the new damage group to a tool/weapon or even a node (see technic mod) to make wearing the armor item meaningful. Simply add the ***armor_groups*** name to the tool items ***damage_groups***. 
+
+**Example**
+
+    minetest.register_tool("mod_name:glowing_sword", {
+	    description = "Glowing Sword",
+	    inventory_image = "mod_name_tool_glowingsword.png",
+	    tool_capabilities = {full_punch_interval = 1.2,max_drop_level=0,
+	    groupcaps={
+		    cracky = {times={[3]=1.60}, uses=10, maxlevel=1},},
+		    damage_groups = {fleshy=10,radiation=20},
+		    },
+		sound = {breaks = "default_tool_breaks"},
+	    groups = {pickaxe = 1, flammable = 2}
+    })
+
+## Groups used by 3d_Armor
+3d_armor has many default groups already registered, these are categorized under 4 main headings
+ - **Elements:** armor_head, armor_torso, armor_legs, armor_feet
+ - **Attributes:** armor_heal, armor_fire, armor_water, armor_feather
+ - **Physics:** physics_jump, physics_speed, physics_gravity
+ - **Durability:** armor_use, flammable
+ 
+***Note: for calculation purposes "Attributes" and "Physics" values stack***
+
+### Elements
+Additional armor elements can be added by dependant mods, for example shields adds the group armor_shield which has by default a limit that only 1 shield can be worn at a time.
+
+Adding Elements is more complex but the below code can be used to add new elements;
+
+    if minetest.global_exists("armor") and armor.elements then
+    	table.insert(armor.elements, "hands")
+    end
+**1st line** not strictly needed but checks that the global table "armor" and subtable "elements" exists   
+**2nd line** adds a new value to the armor.elements table called "hands"  
+
+See ***init.lua*** under **3d_armor>>shields** for a further example
+
+The new armor item can now be registered using the new element
+**Example**
+
+    armor:register_armor("mod_name:gloves_wood", {    
+	    description = "Wood Gauntlets",   
+	    inventory_image = "mod_name_inv_gloves_wood.png",
+	    texture = "mod_name_gloves_wood.png",
+    	preview = "mod_name_gloves_wood_preview.png",   
+	    groups = {armor_hands=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},
+	})
+
+### Attributes
+Three attributes are avaliable in 3d_armor these are armor_heal, armor_fire and armor_water. Although possible to add additional attributes they would do nothing as code needs to be provide to specifiy the behaviour this could be done in a dependant mod
+
+#### Armor_heal
+This isn't how much the armor will heal but relates to the chance the armor will completely block the damage. For each point of ***armor_heal*** there is a 1% chance that damage will be completely blocked, this value will stack between all armor pieces
+
+**Example**
+The below Diamond chestplate has a 12% chance to completely block all damage (armor_heal=12), however so do boots, helmet and trousers so if the player was wearing all 4 pieces they would have a 48% chance of blocking all damage each attack.
+ 
+	armor:register_armor("3d_armor:chestplate_diamond", {
+		description = S("Diamond Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_diamond.png",
+		groups = {armor_torso=1, armor_heal=12, armor_use=200},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	}) 
+
+#### Armor_fire
+***"Armor_fire"*** provides 5 levels of fire protection    
+ - level 1 protects against torches
+ - level 2 protects against crystal spike (Ethereal mod)
+ - level 3 protects against fire
+ - level 4 unused
+ - level 5 protects against lava
+	
+**Example**
+
+	armor:register_armor("mod_name:fire_proof_jacket", {
+		description = "Fire Proof Jacket",
+		inventory_image = "mod_name_inv_fire_proof_jacket.png",
+		groups = {armor_torso=1, armor_fire=3, armor_use=1000},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+
+#### Armor_water
+***"Armor_water"*** will periodically restore a players breath when underwater. This only has one level or state, which is armor_water=1  
+
+**Example**
+
+	armor:register_armor("mod_name:helmet_underwater_breath", {
+		description = "Helmet of Underwater Breathing",
+		inventory_image = "mod_name_inv_helmet_underwater_breath.png",
+		groups = {armor_head=1, armor_water=1, armor_use=1000},
+		armor_groups = {fleshy=5},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+
+#### Armor_feather
+***"Armor_feather"*** will slow a player when falling. This only has one level or state, which is armor_feather=1
+
+### Physics
+The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability. 
+
+***physics_jump*** - Will increase/decrease the jump strength of the player so they can jump more/less. The base number is "1" and any value is added or subtracted, supports fractional so "physics_jump=1" will increase jump strength by 100%. "physics_jump= -0.5" will decrease jump by 50%.  
+
+***physics_speed*** - Will increase/decrease the walk speed of the player so they walk faster/slower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_speed=1.5" will increase speed by 150%, "physics_speed= -0.5" will decrease speed by 50%. 
+
+***physics_gravity*** - Will increase/decrease gravity the player experiences so it's higher/lower. The base number is "1" and any value is added or subtracted, supports fractional so "physics_gravity=2" will increase gravity by 200%, "physics_gravity= -1" will decrease gravity by 100%. 
+
+*Note: The player physics modifications won't be applied via `set_physics_override` if `player_physics_locked` is set to 1 in the respective player's meta.*
+
+### Durability
+Durability is determined by the value assigned to the group ***armor_use***. The higher the ***armor_use*** value the faster/more quickly it is damaged/degrades. This is calculated using the formula:
+
+     Total uses = approx(65535/armor_use)
+	 
+ **Example**  
+ All wood armor items have an ***armor_use=2000***;
+ 
+	65535/2000 = 32.76 (32)   
+ After 32 uses(hits) the armor item will break.   
+ 
+ All diamond armor items have an  ***armor_use=200***;
+ 
+	65535/2000 = 327.6 (327)   
+ After 327 uses(hits) the armor item will break. 
+
+### Armor Material 
+The material the armor is made from is defined by adding the material to the end of registered armor item name. It is very important the material is the last item in the registered item name and it is preceeded by an "_" eg "_materialname".
+The material name is what 3d_armor uses to determine if a player is wearing a set of armor. To recieve the set bonus all items worn must be made of the same material.
+So to get a set bonus under the default set settings the players armor items listed below must be made of the same material:
+* head - Helmet
+* torso - Chestplate
+* legs - Leggings
+* feet - Boots
+* shield - Shields   
+
+If all of the above were made of material "wood" the player would recieve an ***armor_set_bonus*** of armor_level * 1.1, essentially +10%  
+
+ **Example One** 
+ 
+	armor:register_armor("3d_armor:helmet_bronze", {
+		description = S("Bronze Helmet"),
+		inventory_image = "3d_armor_inv_helmet_bronze.png",
+		groups = {armor_head=1, armor_heal=6, armor_use=400, physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+	
+ **Example Two** 
+ 
+	armor:register_armor("new_mod:helmet_spartan_bronze", {
+		description = S("Spartan Helmet"),
+		inventory_image = "new_mod_inv_helmet_spartan_bronze.png",
+		groups = {armor_head=1, armor_heal=6, armor_use=350, physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=12},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+
+***Note: At the moment an armor item can only be made of one material***
+
+## Armor Functions
+
+See also: [API Reference](https://minetest-mods.github.io/3d_armor/reference/)
+
+### armor set_player_armor
+
+	armor:set_player_armor(player)
+
+Primarily an internal function but can be called externally to apply any
+changes that might not otherwise get handled.
+
+### armor punch
+
+	armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
+
+Used to apply damage to all equipped armor based on the damage groups of
+each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities`
+are optional but should be valid if included.
+
+### armor damage
+
+	armor:damage(player, index, stack, use)
+
+Adds wear to a single armor itemstack, triggers `on_damage` callbacks and
+updates the necessary inventories. Also handles item destruction callbacks
+and so should NOT be called from `on_unequip` to avoid an infinite loop.
+
+### armor remove_all
+
+	armor:remove_all(player)
+
+Removes all armors from the player's inventory without triggering any callback.
+
+### armor equip
+
+	armor:equip(player, armor_name)
+
+Equip the armor, removing the itemstack from the main inventory if there's one.
+
+### armor unequip
+
+	armor:unequip(player, armor_name)
+
+Unequip the armor, adding the itemstack to the main inventory.
+
+### armor update_skin
+
+	armor:update_skin(player_name)
+
+Triggers a skin update with the same action as if a field with `skins_set` was submitted.
+
+## Callbacks
+
+### Item Callbacks
+
+In all of the below when armor is destroyed `stack` will contain a copy of the previous stack.
+
+*unsure what this note means may apply to all item callbacks or just on_punched*   
+Return `false` to override armor damage effects.
+
+#### on_equip
+
+	on_equip = func(player, index, stack)
+
+#### on_unequip
+
+	on_unequip = func(player, index, stack)
+
+#### on_destroy 
+
+	on_destroy = func(player, index, stack)
+
+#### on_damage
+
+	on_damage = func(player, index, stack)
+
+#### on_punched
+
+	on_punched = func(player, hitter, time_from_last_punch, tool_capabilities)
+
+`on_punched` is called every time a player is punched or takes damage, `hitter`, `time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the case of fall damage.  
+When fire protection is enabled, hitter == "fire" in the event of fire damage.    
+
+
+### Global Callbacks
+
+#### armor register_on_update
+
+	armor:register_on_update(function(player))
+
+#### armor register_on_equip
+
+	armor:register_on_equip(function(player, index, stack))
+
+#### armor register_on_unequip
+
+	armor:register_on_unequip(function(player, index, stack))
+
+#### armor register_on_destroy
+armor:register_on_destroy(function(player, index, stack))
+
+ **Example**
+
+	armor:register_on_update(function(player)
+		print(player:get_player_name().." armor updated!")
+	end)
+
+
+# Credits
+ 
+### The below have added too, tested or in other ways contributed to the development and ongoing support of 3d_Armor
+
+|Stu              |Stujones11       |Stu              |Github Ghosts    |
+|:---------------:|:---------------:|:---------------:|:---------------:|
+|Pavel_S          |BlockMen         |Tenplus1         |donat-b          |
+|JPRuehmann       |BrandonReese     |Megaf            |Zeg9             |
+|poet.nohit       |Echoes91         |Adimgar          |Khonkhortisan    |
+|VanessaE         |CraigyDavi       |proller          |Thomasrudin      |
+|Byakuren         |kilbith (jp)     |afflatus         |G1ov4            |
+|Thomas-S         |Dragonop         |Napiophelios     |Emojigit         |
+|rubenwardy       |daviddoesminetest|bell07           |OgelGames        |
+|tobyplowy        |crazyginger72    |fireglow         |bhree            |
+|Lone_Wolf(HT)    |Wuzzy(2)         |numberZero       |Monte48          |
+|AntumDeluge      |Terumoc          |runsy            |Dacmot           |
+|codexp           |davidthecreator  |SmallJoker       |orbea            |
+|BuckarooBanzay   |daret            |Exeterdad        |Calinou          |
+|Pilcrow182       |indriApollo      |HybridDog        |CraigyDavi       |
+|Paly-2           |Diogogomes       |                 |                 |
+
+*Note: Names gathered from 3d_armor forum thread and github, I may have missed some people, apologises if I have - S01*  
diff --git a/3d_armor/README.txt b/3d_armor/README.txt
deleted file mode 100644
index 7dbe82d..0000000
--- a/3d_armor/README.txt
+++ /dev/null
@@ -1,191 +0,0 @@
-[mod] Visible Player Armor [3d_armor]
-=====================================
-
-Depends: default
-
-Recommends: sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts)
-
-Supports: player_monoids and armor_monoid
-
-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 weapons.
-
-Armor takes damage when a player is hurt but also offers a percentage chance of healing.
-Overall level is boosted by 10% when wearing a full matching set.
-
-Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1
-protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava.
-
-Armor Configuration
--------------------
-
-Override the following default settings by adding them to your minetest.conf file.
-
--- Set false to disable individual armor materials.
-armor_material_wood = true
-armor_material_cactus = true
-armor_material_steel = true
-armor_material_bronze = true
-armor_material_diamond = true
-armor_material_gold = true
-armor_material_mithril = true
-armor_material_crystal = true
-
--- Increase this if you get initialization glitches when a player first joins.
-armor_init_delay = 2
-
--- Number of initialization attempts.
--- Use in conjunction with armor_init_delay if initialization problems persist.
-armor_init_times = 10
-
--- Increase this if armor is not getting into bones due to server lag.
-armor_bones_delay = 1
-
--- How often player armor items are updated.
-armor_update_time = 1
-
--- Drop armor when a player dies.
--- Uses bones mod if present, otherwise items are dropped around the player.
-armor_drop = true
-
--- Pulverise armor when a player dies, overrides armor_drop.
-armor_destroy = 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 = 1
-
--- You can use this to increase or decrease overall armor healing,
--- eg: armor_heal_multiplier = 0 will disable healing altogether.
-armor_heal_multiplier = 1
-
--- Enable water protection (periodically restores breath when activated)
-armor_water_protect = true
-
--- Enable fire protection (defaults true if using ethereal mod)
-armor_fire_protect = false
-
--- Enable punch damage effects.
-armor_punch_damage = true
-
--- Enable migration of old armor inventories
-armor_migrate_old_inventory = true
-
-API
----
-
-Armor Registration:
-
-armor:register_armor(name, def)
-
-Wrapper function for `minetest.register_tool`, while registering armor as
-a tool item is still supported, this may be deprecated in future so new code
-should use this method.
-
-Additional fields supported by 3d_armor:
-
-	texture = <filename>
-	preview = <filename>
-	armor_groups = <table>
-	damage_groups = <table>
-	reciprocate_damage = <bool>
-	on_equip = <function>
-	on_unequip = <function>
-	on_destroy = <function>
-	on_damage = <function>
-	on_punched = <function>
-
-armor:register_armor_group(group, base)
-
-Example:
-
-armor:register_armor_group("radiation", 100)
-
-armor:register_armor("mod_name:speed_boots", {
-	description = "Speed Boots",
-	inventory_image = "mod_name_speed_boots_inv.png",
-	texture = "mod_name_speed_boots.png",
-	preview = "mod_name_speed_boots_preview.png",
-	groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1},
-	armor_groups = {fleshy=10, radiation=10},
-	damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1},
-	reciprocate_damage = true,
-	on_destroy = function(player, index, stack)
-		local pos = player:get_pos()
-		if pos then
-			minetest.sound_play({
-				name = "mod_name_break_sound",
-				pos = pos,
-				gain = 0.5,
-			})
-		end
-	end,
-})
-
-See armor.lua, technic_armor and shields mods for more examples.
-
-Default groups:
-
-Elements: armor_head, armor_torso, armor_legs, armor_feet
-Attributes: armor_heal, armor_fire, armor_water
-Physics: physics_jump, physics_speed, physics_gravity
-Durability: armor_use, flammable
-
-Notes:
-
-Elements may be modified by dependent mods, eg shields adds armor_shield.
-Attributes and physics values are 'stackable', durability is determined
-by the level of armor_use, total uses == approx (65535/armor_use), non-fleshy
-damage groups need to be defined in the tool/weapon used against the player.
-
-Reciprocal tool damage will be done only by the first armor inventory item
- with `reciprocate_damage = true`
-
-Armor Functions:
-
-armor:set_player_armor(player)
-
-Primarily an internal function but can be called externally to apply any
-changes that might not otherwise get handled.
-
-armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
-
-Used to apply damage to all equipped armor based on the damage groups of
-each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities`
-are optional but should be valid if included.
-
-armor:damage(player, index, stack, use)
-
-Adds wear to a single armor itemstack, triggers `on_damage` callbacks and
-updates the necessary inventories. Also handles item destruction callbacks
-and so should NOT be called from `on_unequip` to avoid an infinite loop.
-
-Item Callbacks:
-
-on_equip = func(player, index, stack)
-on_unequip = func(player, index, stack)
-on_destroy = func(player, index, stack)
-on_damage = func(player, index, stack)
-on_punched = func(player, hitter, time_from_last_punch, tool_capabilities)
-
-Notes:
-
-`on_punched` is called every time a player is punched or takes damage, `hitter`,
-`time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the
-case of fall damage, etc. When fire protection is enabled, hitter == "fire"
-in the event of fire damage. Return `false` to override armor damage effects.
-When armor is destroyed `stack` will contain a copy of the previous stack.
-
-Global Callbacks:
-
-armor:register_on_update(func(player))
-armor:register_on_equip(func(player, index, stack))
-armor:register_on_unequip(func(player, index, stack))
-armor:register_on_destroy(func(player, index, stack))
-
-Global Callback Example:
-
-armor:register_on_update(function(player)
-	print(player:get_player_name().." armor updated!")
-end)
-
diff --git a/3d_armor/api.lua b/3d_armor/api.lua
index 87c979c..2378166 100644
--- a/3d_armor/api.lua
+++ b/3d_armor/api.lua
@@ -1,5 +1,84 @@
+
+--- 3D Armor API
+--
+--  @topic api
+
+
+local transparent_armor = minetest.settings:get_bool("armor_transparent", false)
+
+
+--- Tables
+--
+--  @section tables
+
+--- Armor definition table used for registering armor.
+--
+--  @table ArmorDef
+--  @tfield string description Human-readable name/description.
+--  @tfield string inventory_image Image filename used for icon.
+--  @tfield table groups See: `ArmorDef.groups`
+--  @tfield table armor_groups See: `ArmorDef.armor_groups`
+--  @tfield table damage_groups See: `ArmorDef.damage_groups`
+--  @see ItemDef
+--  @usage local def = {
+--    description = "Wood Helmet",
+--    inventory_image = "3d_armor_inv_helmet_wood.png",
+--    groups = {armor_head=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},
+--  }
+
+--- Groups table.
+--
+--  General groups defining item behavior.
+--
+--  Some commonly used groups: ***armor\_&lt;type&gt;***, ***armor\_heal***, ***armor\_use***
+--
+--  @table ArmorDef.groups
+--  @tfield int armor_type The armor type. "head", "torso", "hands", "shield", etc.
+--  (**Note:** replace "type" with actual type).
+--  @tfield int armor_heal Healing value of armor when equipped.
+--  @tfield int armor_use Amount of uses/damage before armor "breaks".
+--  @see groups
+--  @usage groups = {
+--    armor_head = 1,
+--    armor_heal = 5,
+--    armor_use = 2000,
+--    flammable = 1,
+--  }
+
+--- Armor groups table.
+--
+--  Groups that this item is effective against when taking damage.
+--
+--  Some commonly used groups: ***fleshy***
+--
+--  @table ArmorDef.armor_groups
+--  @usage armor_groups = {
+--    fleshy = 5,
+--  }
+
+--- Damage groups table.
+--
+--  Groups that this item is effective on when used as a weapon/tool.
+--
+--  Some commonly used groups: ***cracky***, ***snappy***, ***choppy***, ***crumbly***, ***level***
+--
+--  @table ArmorDef.damage_groups
+--  @see entity_damage_mechanism
+--  @usage damage_groups = {
+--    cracky = 3,
+--    snappy = 2,
+--    choppy = 3,
+--    crumbly = 2,
+--    level = 1,
+--  }
+
+--- @section end
+
+
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 
 local skin_previews = {}
 local use_player_monoids = minetest.global_exists("player_monoids")
@@ -33,7 +112,7 @@ armor = {
 	timer = 0,
 	elements = {"head", "torso", "legs", "feet"},
 	physics = {"jump", "speed", "gravity"},
-	attributes = {"heal", "fire", "water"},
+	attributes = {"heal", "fire", "water", "feather"},
 	formspec = "image[2.5,0;2,4;armor_preview]"..
 		default.gui_bg..
 		default.gui_bg_img..
@@ -53,14 +132,17 @@ armor = {
 		gold = "default:gold_ingot",
 		mithril = "moreores:mithril_ingot",
 		crystal = "ethereal:crystal_ingot",
+		nether = "nether:nether_ingot",
 	},
 	fire_nodes = {
+		{"nether:lava_source",      5, 8},
 		{"default:lava_source",     5, 8},
 		{"default:lava_flowing",    5, 8},
 		{"fire:basic_flame",        3, 4},
 		{"fire:permanent_flame",    3, 4},
 		{"ethereal:crystal_spike",  2, 1},
 		{"ethereal:fire_flower",    2, 1},
+		{"nether:lava_crust",       2, 1},
 		{"default:torch",           1, 1},
 		{"default:torch_ceiling",   1, 1},
 		{"default:torch_wall",      1, 1},
@@ -74,7 +156,8 @@ armor = {
 		on_destroy = {},
 	},
 	migrate_old_inventory = true,
-	version = "0.4.13",
+  version = "0.4.13",
+  get_translator = S
 }
 
 armor.config = {
@@ -94,17 +177,63 @@ armor.config = {
 	material_gold = true,
 	material_mithril = true,
 	material_crystal = true,
+	material_nether = true,
+	set_elements = "head torso legs feet shield",
+	set_multiplier = 1.1,
 	water_protect = true,
 	fire_protect = minetest.get_modpath("ethereal") ~= nil,
+	fire_protect_torch = minetest.get_modpath("ethereal") ~= nil,
+	feather_fall = true,
 	punch_damage = true,
 }
 
--- Armor Registration
 
+--- Methods
+--
+--  @section methods
+
+--- Registers a new armor item.
+--
+--  @function armor:register_armor
+--  @tparam string name Armor item technical name (ex: "3d\_armor:helmet\_gold").
+--  @tparam ArmorDef def Armor definition table.
+--  @usage armor:register_armor("3d_armor:helmet_wood", {
+--    description = "Wood Helmet",
+--    inventory_image = "3d_armor_inv_helmet_wood.png",
+--    groups = {armor_head=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},
+--  })
 armor.register_armor = function(self, name, def)
+	def.on_secondary_use = function(itemstack, player)
+		return armor:equip(player, itemstack)
+	end
+	def.on_place = function(itemstack, player, pointed_thing)
+		if pointed_thing.type == "node" and player and not player:get_player_control().sneak then
+			local node = minetest.get_node(pointed_thing.under)
+			local ndef = minetest.registered_nodes[node.name]
+			if ndef and ndef.on_rightclick then
+				return ndef.on_rightclick(pointed_thing.under, node, player, itemstack, pointed_thing)
+			end
+		end
+		return armor:equip(player, itemstack)
+	end
+	-- The below is a very basic check to try and see if a material name exists as part
+	-- of the item name. However this check is very simple and just checks theres "_something"
+	-- at the end of the item name and logging an error to debug if not.
+	local check_mat_exists = string.match(name, "%:.+_(.+)$")
+	if check_mat_exists == nil then
+		minetest.log("warning:[3d_armor] Registered armor "..name..
+		" does not have \"_material\" specified at the end of the item registration name")
+	end
 	minetest.register_tool(name, def)
 end
 
+--- Registers a new armor group.
+--
+--  @function armor:register_armor_group
+--  @tparam string group Group ID.
+--  @tparam int base Base armor value.
 armor.register_armor_group = function(self, group, base)
 	base = base or 100
 	self.registered_groups[group] = base
@@ -113,38 +242,92 @@ armor.register_armor_group = function(self, group, base)
 	end
 end
 
--- Armor callbacks
+--- Armor Callbacks Registration
+--
+--  @section callbacks
 
+--- Registers a callback for when player visuals are update.
+--
+--  @function armor:register_on_update
+--  @tparam function func Function to be executed.
+--  @see armor:update_player_visuals
+--  @usage armor:register_on_update(function(player, index, stack)
+--    -- code to execute
+--  end)
 armor.register_on_update = function(self, func)
 	if type(func) == "function" then
 		table.insert(self.registered_callbacks.on_update, func)
 	end
 end
 
+--- Registers a callback for when armor is equipped.
+--
+--  @function armor:register_on_equip
+--  @tparam function func Function to be executed.
+--  @usage armor:register_on_equip(function(player, index, stack)
+--    -- code to execute
+--  end)
 armor.register_on_equip = function(self, func)
 	if type(func) == "function" then
 		table.insert(self.registered_callbacks.on_equip, func)
 	end
 end
 
+--- Registers a callback for when armor is unequipped.
+--
+--  @function armor:register_on_unequip
+--  @tparam function func Function to be executed.
+--  @usage armor:register_on_unequip(function(player, index, stack)
+--    -- code to execute
+--  end)
 armor.register_on_unequip = function(self, func)
 	if type(func) == "function" then
 		table.insert(self.registered_callbacks.on_unequip, func)
 	end
 end
 
+--- Registers a callback for when armor is damaged.
+--
+--  @function armor:register_on_damage
+--  @tparam function func Function to be executed.
+--  @see armor:damage
+--  @usage armor:register_on_damage(function(player, index, stack)
+--    -- code to execute
+--  end)
 armor.register_on_damage = function(self, func)
 	if type(func) == "function" then
 		table.insert(self.registered_callbacks.on_damage, func)
 	end
 end
 
+--- Registers a callback for when armor is destroyed.
+--
+--  @function armor:register_on_destroy
+--  @tparam function func Function to be executed.
+--  @see armor:damage
+--  @usage armor:register_on_destroy(function(player, index, stack)
+--    -- code to execute
+--  end)
 armor.register_on_destroy = function(self, func)
 	if type(func) == "function" then
 		table.insert(self.registered_callbacks.on_destroy, func)
 	end
 end
 
+--- @section end
+
+
+--- Methods
+--
+--  @section methods
+
+--- Runs callbacks.
+--
+--  @function armor:run_callbacks
+--  @tparam function callback Function to execute.
+--  @tparam ObjectRef player First parameter passed to callback.
+--  @tparam int index Second parameter passed to callback.
+--  @tparam ItemStack stack Callback owner.
 armor.run_callbacks = function(self, callback, player, index, stack)
 	if stack then
 		local def = stack:get_definition() or {}
@@ -160,6 +343,10 @@ armor.run_callbacks = function(self, callback, player, index, stack)
 	end
 end
 
+--- Updates visuals.
+--
+--  @function armor:update_player_visuals
+--  @tparam ObjectRef player
 armor.update_player_visuals = function(self, player)
 	if not player then
 		return
@@ -175,6 +362,10 @@ armor.update_player_visuals = function(self, player)
 	self:run_callbacks("on_update", player)
 end
 
+--- Sets player's armor attributes.
+--
+--  @function armor:set_player_armor
+--  @tparam ObjectRef player
 armor.set_player_armor = function(self, player)
 	local name, armor_inv = self:get_valid_player(player, "[set_player_armor]")
 	if not name then
@@ -182,7 +373,6 @@ armor.set_player_armor = function(self, player)
 	end
 	local state = 0
 	local count = 0
-	local material = {count=1}
 	local preview = armor:get_preview(name)
 	local texture = "3d_armor_trans.png"
 	local physics = {}
@@ -190,6 +380,9 @@ armor.set_player_armor = function(self, player)
 	local levels = {}
 	local groups = {}
 	local change = {}
+	local set_worn = {}
+	local armor_multi = 0
+	local worn_armor = armor:get_weared_armor_elements(player)
 	for _, phys in pairs(self.physics) do
 		physics[phys] = 1
 	end
@@ -231,7 +424,9 @@ armor.set_player_armor = function(self, player)
 			tex = tex:gsub(".png$", "")
 			local prev = def.preview or tex.."_preview"
 			prev = prev:gsub(".png$", "")
-			texture = texture.."^"..tex..".png"
+			if not transparent_armor then
+				texture = texture.."^"..tex..".png"
+			end
 			preview = preview.."^"..prev..".png"
 			state = state + stack:get_wear()
 			count = count + 1
@@ -243,21 +438,38 @@ armor.set_player_armor = function(self, player)
 				local value = def.groups["armor_"..attr] or 0
 				attributes[attr] = attributes[attr] + value
 			end
-			local mat = string.match(item, "%:.+_(.+)$")
-			if material.name then
-				if material.name == mat then
-					material.count = material.count + 1
+		end
+	end
+	-- The following code compares player worn armor items against requirements
+	-- of which armor pieces are needed to be worn to meet set bonus requirements
+	for loc,item in pairs(worn_armor) do
+		local item_mat = string.match(item, "%:.+_(.+)$")
+		local worn_key = item_mat or "unknown"
+
+		-- Perform location checks to ensure the armor is worn correctly
+		for k,set_loc in pairs(armor.config.set_elements)do
+			if set_loc == loc then
+				if set_worn[worn_key] == nil then
+					set_worn[worn_key] = 0
+					set_worn[worn_key] = set_worn[worn_key] + 1
+				else
+					set_worn[worn_key] = set_worn[worn_key] + 1
 				end
-			else
-				material.name = mat
 			end
 		end
 	end
+
+	-- Apply the armor multiplier only if the player is wearing a full set of armor
+	for mat_name,arm_piece_num in pairs(set_worn) do
+		if arm_piece_num == #armor.config.set_elements then
+			armor_multi = armor.config.set_multiplier
+		end
+	end
 	for group, level in pairs(levels) do
 		if level > 0 then
 			level = level * armor.config.level_multiplier
-			if material.name and material.count == #self.elements then
-				level = level * 1.1
+			if armor_multi ~= 0 then
+				level = level * armor.config.set_multiplier
 			end
 		end
 		local base = self.registered_groups[group]
@@ -279,10 +491,13 @@ armor.set_player_armor = function(self, player)
 		armor_monoid.monoid:add_change(player, change, "3d_armor:armor")
 	else
 		-- Preserve immortal group (damage disabled for player)
-		local immortal = player:get_armor_groups().immortal
+		local player_groups = player:get_armor_groups()
+		local immortal = player_groups.immortal
 		if immortal and immortal ~= 0 then
 			groups.immortal = 1
 		end
+		-- Preserve fall_damage_add_percent group (fall damage modifier)
+		groups.fall_damage_add_percent = player_groups.fall_damage_add_percent
 		player:set_armor_groups(groups)
 	end
 	if use_player_monoids then
@@ -301,7 +516,10 @@ armor.set_player_armor = function(self, player)
 		})
 		pova.do_override(player)
 	else
-		player:set_physics_override(physics)
+		local player_physics_locked = player:get_meta():get_int("player_physics_locked")
+		if player_physics_locked == nil or player_physics_locked == 0 then
+			player:set_physics_override(physics)
+		end
 	end
 	self.textures[name].armor = texture
 	self.textures[name].preview = preview
@@ -311,6 +529,13 @@ armor.set_player_armor = function(self, player)
 	self:update_player_visuals(player)
 end
 
+--- Action when armor is punched.
+--
+--  @function armor:punch
+--  @tparam ObjectRef player Player wearing the armor.
+--  @tparam ObjectRef hitter Entity attacking player.
+--  @tparam[opt] int time_from_last_punch Time in seconds since last punch action.
+--  @tparam[opt] table tool_capabilities See `entity_damage_mechanism`.
 armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities)
 	local name, armor_inv = self:get_valid_player(player, "[punch]")
 	if not name then
@@ -339,6 +564,9 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili
 				local groupcaps = tool_capabilities.groupcaps or {}
 				local uses = 0
 				damage = false
+				if next(groupcaps) == nil then
+					damage = true
+				end
 				for group, caps in pairs(groupcaps) do
 					local maxlevel = caps.maxlevel or 0
 					local diff = maxlevel - level
@@ -393,8 +621,21 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili
 	self.def[name].count = count
 end
 
+--- Action when armor is damaged.
+--
+--  @function armor:damage
+--  @tparam ObjectRef player
+--  @tparam int index Inventory index where armor is equipped.
+--  @tparam ItemStack stack Armor item receiving damaged.
+--  @tparam int use Amount of wear to add to armor item.
 armor.damage = function(self, player, index, stack, use)
 	local old_stack = ItemStack(stack)
+	local worn_armor = armor:get_weared_armor_elements(player)
+	local armor_worn_cnt = 0
+	for k,v in pairs(worn_armor) do
+		armor_worn_cnt = armor_worn_cnt + 1
+	end
+	use = math.ceil(use/armor_worn_cnt)
 	stack:add_wear(use)
 	self:run_callbacks("on_damage", player, index, stack)
 	self:set_inventory_stack(player, index, stack)
@@ -405,21 +646,147 @@ armor.damage = function(self, player, index, stack, use)
 	end
 end
 
+--- Get elements of equipped armor.
+--
+--  @function armor:get_weared_armor_elements
+--  @tparam ObjectRef player
+--  @treturn table List of equipped armors.
+armor.get_weared_armor_elements = function(self, player)
+    local name, inv = self:get_valid_player(player, "[get_weared_armor]")
+	local weared_armor = {}
+	if not name then
+		return
+	end
+    for i=1, inv:get_size("armor") do
+        local item_name = inv:get_stack("armor", i):get_name()
+        local element = self:get_element(item_name)
+        if element ~= nil then
+            weared_armor[element] = item_name
+        end
+	end
+	return weared_armor
+end
+
+--- Equips a piece of armor to a player.
+--
+--  @function armor:equip
+--  @tparam ObjectRef player Player to whom item is equipped.
+--  @tparam ItemStack itemstack Armor item to be equipped.
+--  @treturn ItemStack Leftover item stack.
+armor.equip = function(self, player, itemstack)
+    local name, armor_inv = self:get_valid_player(player, "[equip]")
+    local armor_element = self:get_element(itemstack:get_name())
+	if name and armor_element then
+		local index
+		for i=1, armor_inv:get_size("armor") do
+			local stack = armor_inv:get_stack("armor", i)
+			if self:get_element(stack:get_name()) == armor_element then
+				index = i
+				self:unequip(player, armor_element)
+				break
+			elseif not index and stack:is_empty() then
+				index = i
+			end
+		end
+		local stack = itemstack:take_item()
+		armor_inv:set_stack("armor", index, stack)
+		self:run_callbacks("on_equip", player, index, stack)
+		self:set_player_armor(player)
+		self:save_armor_inventory(player)
+	end
+	return itemstack
+end
+
+--- Unequips a piece of armor from a player.
+--
+--  @function armor:unequip
+--  @tparam ObjectRef player Player from whom item is removed.
+--  @tparam string armor_element Armor type identifier associated with the item
+--  to be removed ("head", "torso", "hands", "shield", "legs", "feet", etc.).
+armor.unequip = function(self, player, armor_element)
+    local name, armor_inv = self:get_valid_player(player, "[unequip]")
+	if not name then
+		return
+	end
+	for i=1, armor_inv:get_size("armor") do
+		local stack = armor_inv:get_stack("armor", i)
+		if self:get_element(stack:get_name()) == armor_element then
+			armor_inv:set_stack("armor", i, "")
+			minetest.after(0, function()
+				local inv = player:get_inventory()
+				if inv:room_for_item("main", stack) then
+					inv:add_item("main", stack)
+				else
+					minetest.add_item(player:get_pos(), stack)
+				end
+			end)
+			self:run_callbacks("on_unequip", player, i, stack)
+			self:set_player_armor(player)
+			self:save_armor_inventory(player)
+			return
+		end
+	end
+end
+
+--- Removes all armor worn by player.
+--
+--  @function armor:remove_all
+--  @tparam ObjectRef player
+armor.remove_all = function(self, player)
+    local name, inv = self:get_valid_player(player, "[remove_all]")
+	if not name then
+		return
+    end
+	inv:set_list("armor", {})
+	self:set_player_armor(player)
+	self:save_armor_inventory(player)
+end
+
+local skin_mod
+
+--- Retrieves player's current skin.
+--
+--  @function armor:get_player_skin
+--  @tparam string name Player name.
+--  @treturn string Skin filename.
 armor.get_player_skin = function(self, name)
-	if (self.skin_mod == "skins" or self.skin_mod == "simple_skins") and skins.skins[name] then
+	if (skin_mod == "skins" or skin_mod == "simple_skins") and skins.skins[name] then
 		return skins.skins[name]..".png"
-	elseif self.skin_mod == "u_skins" and u_skins.u_skins[name] then
+	elseif skin_mod == "u_skins" and u_skins.u_skins[name] then
 		return u_skins.u_skins[name]..".png"
-	elseif self.skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then
+	elseif skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then
 		return wardrobe.playerSkins[name]
 	end
 	return armor.default_skin..".png"
 end
 
+--- Updates skin.
+--
+--  @function armor:update_skin
+--  @tparam string name Player name.
+armor.update_skin = function(self, name)
+	minetest.after(0, function()
+		local pplayer = minetest.get_player_by_name(name)
+		if pplayer then
+			self.textures[name].skin = self:get_player_skin(name)
+			self:set_player_armor(pplayer)
+		end
+	end)
+end
+
+--- Adds preview for armor inventory.
+--
+--  @function armor:add_preview
+--  @tparam string preview Preview image filename.
 armor.add_preview = function(self, preview)
 	skin_previews[preview] = true
 end
 
+--- Retrieves preview for armor inventory.
+--
+--  @function armor:get_preview
+--  @tparam string name Player name.
+--  @treturn string Preview image filename.
 armor.get_preview = function(self, name)
 	local preview = string.gsub(armor:get_player_skin(name), ".png", "_preview.png")
 	if skin_previews[preview] then
@@ -428,6 +795,12 @@ armor.get_preview = function(self, name)
 	return "character_preview.png"
 end
 
+--- Retrieves armor formspec.
+--
+--  @function armor:get_armor_formspec
+--  @tparam string name Player name.
+--  @tparam[opt] bool listring Use `listring` formspec element (default: `false`).
+--  @treturn string Formspec formatted string.
 armor.get_armor_formspec = function(self, name, listring)
 	if armor.def[name].init_time == 0 then
 		return "label[0,0;Armor not initialized!]"
@@ -450,6 +823,11 @@ armor.get_armor_formspec = function(self, name, listring)
 	return formspec
 end
 
+--- Retrieves element.
+--
+--  @function armor:get_element
+--  @tparam string item_name
+--  @return Armor element.
 armor.get_element = function(self, item_name)
 	for _, element in pairs(armor.elements) do
 		if minetest.get_item_group(item_name, "armor_"..element) > 0 then
@@ -458,6 +836,11 @@ armor.get_element = function(self, item_name)
 	end
 end
 
+--- Serializes armor inventory.
+--
+--  @function armor:serialize_inventory_list
+--  @tparam table list Inventory contents.
+--  @treturn string
 armor.serialize_inventory_list = function(self, list)
 	local list_table = {}
 	for _, stack in ipairs(list) do
@@ -466,6 +849,11 @@ armor.serialize_inventory_list = function(self, list)
 	return minetest.serialize(list_table)
 end
 
+--- Deserializes armor inventory.
+--
+--  @function armor:deserialize_inventory_list
+--  @tparam string list_string Serialized inventory contents.
+--  @treturn table
 armor.deserialize_inventory_list = function(self, list_string)
 	local list_table = minetest.deserialize(list_string)
 	local list = {}
@@ -475,6 +863,11 @@ armor.deserialize_inventory_list = function(self, list_string)
 	return list
 end
 
+--- Loads armor inventory.
+--
+--  @function armor:load_armor_inventory
+--  @tparam ObjectRef player
+--  @treturn bool
 armor.load_armor_inventory = function(self, player)
 	local _, inv = self:get_valid_player(player, "[load_armor_inventory]")
 	if inv then
@@ -488,6 +881,12 @@ armor.load_armor_inventory = function(self, player)
 	end
 end
 
+--- Saves armor inventory.
+--
+--  Inventory is stored in `PlayerMetaRef` string "3d\_armor\_inventory".
+--
+--  @function armor:save_armor_inventory
+--  @tparam ObjectRef player
 armor.save_armor_inventory = function(self, player)
 	local _, inv = self:get_valid_player(player, "[save_armor_inventory]")
 	if inv then
@@ -497,10 +896,22 @@ armor.save_armor_inventory = function(self, player)
 	end
 end
 
+--- Updates inventory.
+--
+--  DEPRECATED: Legacy inventory support.
+--
+--  @function armor:update_inventory
+--  @param player
 armor.update_inventory = function(self, player)
 	-- DEPRECATED: Legacy inventory support
 end
 
+--- Sets inventory stack.
+--
+--  @function armor:set_inventory_stack
+--  @tparam ObjectRef player
+--  @tparam int i Armor inventory index.
+--  @tparam ItemStack stack Armor item.
 armor.set_inventory_stack = function(self, player, i, stack)
 	local _, inv = self:get_valid_player(player, "[set_inventory_stack]")
 	if inv then
@@ -509,25 +920,38 @@ armor.set_inventory_stack = function(self, player, i, stack)
 	end
 end
 
+--- Checks for a player that can use armor.
+--
+--  @function armor:get_valid_player
+--  @tparam ObjectRef player
+--  @tparam string msg Additional info for log messages.
+--  @treturn list Player name & armor inventory.
+--  @usage local name, inv = armor:get_valid_player(player, "[equip]")
 armor.get_valid_player = function(self, player, msg)
 	msg = msg or ""
 	if not player then
-		minetest.log("warning", S("3d_armor: Player reference is nil @1", msg))
+		minetest.log("warning", ("3d_armor%s: Player reference is nil"):format(msg))
 		return
 	end
 	local name = player:get_player_name()
 	if not name then
-		minetest.log("warning", S("3d_armor: Player name is nil @1", msg))
+		minetest.log("warning", ("3d_armor%s: Player name is nil"):format(msg))
 		return
 	end
 	local inv = minetest.get_inventory({type="detached", name=name.."_armor"})
 	if not inv then
-		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg))
+		-- This check may fail when called inside `on_joinplayer`
+		-- in that case, the armor will be initialized/updated later on
+		minetest.log("warning", ("3d_armor%s: Detached armor inventory is nil"):format(msg))
 		return
 	end
 	return name, inv
 end
 
+--- Drops armor item at given position.
+--
+--  @tparam vector pos
+--  @tparam ItemStack stack Armor item to be dropped.
 armor.drop_armor = function(pos, stack)
 	local node = minetest.get_node_or_nil(pos)
 	if node then
@@ -537,3 +961,12 @@ armor.drop_armor = function(pos, stack)
 		end
 	end
 end
+
+--- Allows skin mod to be set manually.
+--
+--  Useful for skin mod forks that do not use the same name.
+--
+--  @tparam string mod Name of skin mod. Recognized names are "simple\_skins", "u\_skins", & "wardrobe".
+armor.set_skin_mod = function(mod)
+	skin_mod = mod
+end
diff --git a/3d_armor/armor.conf.example b/3d_armor/armor.conf.example
index 9ce34b4..af40396 100644
--- a/3d_armor/armor.conf.example
+++ b/3d_armor/armor.conf.example
@@ -15,6 +15,7 @@ ARMOR_MATERIALS = {
 	gold = "default:gold_ingot",
 	mithril = "moreores:mithril_ingot",
 	crystal = "ethereal:crystal_ingot",
+	nether = "nether:nether_ingot",
 }
 
 -- Enable fire protection (defaults true if using ethereal mod)
diff --git a/3d_armor/armor.lua b/3d_armor/armor.lua
deleted file mode 100644
index 171ce03..0000000
--- a/3d_armor/armor.lua
+++ /dev/null
@@ -1,372 +0,0 @@
--- support for i18n
-local S = armor_i18n.gettext
-
-armor:register_armor("3d_armor:helmet_admin", {
-	description = S("Admin Helmet"),
-	inventory_image = "3d_armor_inv_helmet_admin.png",
-	armor_groups = {fleshy=100},
-	groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1,
-			not_in_creative_inventory=1},
-	on_drop = function(itemstack, dropper, pos)
-		return
-	end,
-})
-
-armor:register_armor("3d_armor:chestplate_admin", {
-	description = S("Admin Chestplate"),
-	inventory_image = "3d_armor_inv_chestplate_admin.png",
-	armor_groups = {fleshy=100},
-	groups = {armor_torso=1, armor_heal=100, armor_use=0,
-			not_in_creative_inventory=1},
-	on_drop = function(itemstack, dropper, pos)
-		return
-	end,
-})
-
-armor:register_armor("3d_armor:leggings_admin", {
-	description = S("Admin Leggings"),
-	inventory_image = "3d_armor_inv_leggings_admin.png",
-	armor_groups = {fleshy=100},
-	groups = {armor_legs=1, armor_heal=100, armor_use=0,
-			not_in_creative_inventory=1},
-	on_drop = function(itemstack, dropper, pos)
-		return
-	end,
-})
-
-armor:register_armor("3d_armor:boots_admin", {
-	description = S("Admin Boots"),
-	inventory_image = "3d_armor_inv_boots_admin.png",
-	armor_groups = {fleshy=100},
-	groups = {armor_feet=1, armor_heal=100, armor_use=0,
-			not_in_creative_inventory=1},
-	on_drop = function(itemstack, dropper, pos)
-		return
-	end,
-})
-
-minetest.register_alias("adminboots", "3d_armor:boots_admin")
-minetest.register_alias("adminhelmet", "3d_armor:helmet_admin")
-minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin")
-minetest.register_alias("adminleggings", "3d_armor:leggings_admin")
-
-if armor.materials.wood then
-	armor:register_armor("3d_armor:helmet_wood", {
-		description = S("Wood Helmet"),
-		inventory_image = "3d_armor_inv_helmet_wood.png",
-		groups = {armor_head=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},
-	})
-	armor:register_armor("3d_armor:chestplate_wood", {
-		description = S("Wood Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_wood.png",
-		groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
-	})
-	armor:register_armor("3d_armor:leggings_wood", {
-		description = S("Wood Leggings"),
-		inventory_image = "3d_armor_inv_leggings_wood.png",
-		groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
-	})
-	armor:register_armor("3d_armor:boots_wood", {
-		description = S("Wood Boots"),
-		inventory_image = "3d_armor_inv_boots_wood.png",
-		armor_groups = {fleshy=5},
-		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
-		groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1},
-	})
-	local wood_armor_fuel = {
-		helmet = 6,
-		chestplate = 8,
-		leggings = 7,
-		boots = 5
-	}
-	for armor, burn in pairs(wood_armor_fuel) do
-		minetest.register_craft({
-			type = "fuel",
-			recipe = "3d_armor:" .. armor .. "_wood",
-			burntime = burn,
-		})
-	end
-end
-
-if armor.materials.cactus then
-	armor:register_armor("3d_armor:helmet_cactus", {
-		description = S("Cactus Helmet"),
-		inventory_image = "3d_armor_inv_helmet_cactus.png",
-		groups = {armor_head=1, armor_heal=0, armor_use=1000},
-		armor_groups = {fleshy=5},
-		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
-	})
-	armor:register_armor("3d_armor:chestplate_cactus", {
-		description = S("Cactus Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_cactus.png",
-		groups = {armor_torso=1, armor_heal=0, armor_use=1000},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
-	})
-	armor:register_armor("3d_armor:leggings_cactus", {
-		description = S("Cactus Leggings"),
-		inventory_image = "3d_armor_inv_leggings_cactus.png",
-		groups = {armor_legs=1, armor_heal=0, armor_use=1000},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
-	})
-	armor:register_armor("3d_armor:boots_cactus", {
-		description = S("Cactus Boots"),
-		inventory_image = "3d_armor_inv_boots_cactus.png",
-		groups = {armor_feet=1, armor_heal=0, armor_use=1000},
-		armor_groups = {fleshy=5},
-		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
-	})
-	local cactus_armor_fuel = {
-		helmet = 14,
-		chestplate = 16,
-		leggings = 15,
-		boots = 13
-	}
-	for armor, burn in pairs(cactus_armor_fuel) do
-		minetest.register_craft({
-			type = "fuel",
-			recipe = "3d_armor:" .. armor .. "_cactus",
-			burntime = burn,
-		})
-	end
-end
-
-if armor.materials.steel then
-	armor:register_armor("3d_armor:helmet_steel", {
-		description = S("Steel Helmet"),
-		inventory_image = "3d_armor_inv_helmet_steel.png",
-		groups = {armor_head=1, armor_heal=0, armor_use=800,
-			physics_speed=-0.01, physics_gravity=0.01},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:chestplate_steel", {
-		description = S("Steel Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_steel.png",
-		groups = {armor_torso=1, armor_heal=0, armor_use=800,
-			physics_speed=-0.04, physics_gravity=0.04},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:leggings_steel", {
-		description = S("Steel Leggings"),
-		inventory_image = "3d_armor_inv_leggings_steel.png",
-		groups = {armor_legs=1, armor_heal=0, armor_use=800,
-			physics_speed=-0.03, physics_gravity=0.03},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:boots_steel", {
-		description = S("Steel Boots"),
-		inventory_image = "3d_armor_inv_boots_steel.png",
-		groups = {armor_feet=1, armor_heal=0, armor_use=800,
-			physics_speed=-0.01, physics_gravity=0.01},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
-	})
-end
-
-if armor.materials.bronze then
-	armor:register_armor("3d_armor:helmet_bronze", {
-		description = S("Bronze Helmet"),
-		inventory_image = "3d_armor_inv_helmet_bronze.png",
-		groups = {armor_head=1, armor_heal=6, armor_use=400,
-			physics_speed=-0.01, physics_gravity=0.01},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:chestplate_bronze", {
-		description = S("Bronze Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_bronze.png",
-		groups = {armor_torso=1, armor_heal=6, armor_use=400,
-			physics_speed=-0.04, physics_gravity=0.04},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:leggings_bronze", {
-		description = S("Bronze Leggings"),
-		inventory_image = "3d_armor_inv_leggings_bronze.png",
-		groups = {armor_legs=1, armor_heal=6, armor_use=400,
-			physics_speed=-0.03, physics_gravity=0.03},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
-	})
-	armor:register_armor("3d_armor:boots_bronze", {
-		description = S("Bronze Boots"),
-		inventory_image = "3d_armor_inv_boots_bronze.png",
-		groups = {armor_feet=1, armor_heal=6, armor_use=400,
-			physics_speed=-0.01, physics_gravity=0.01},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
-	})
-end
-
-if armor.materials.diamond then
-	armor:register_armor("3d_armor:helmet_diamond", {
-		description = S("Diamond Helmet"),
-		inventory_image = "3d_armor_inv_helmet_diamond.png",
-		groups = {armor_head=1, armor_heal=12, armor_use=200},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
-	})
-	armor:register_armor("3d_armor:chestplate_diamond", {
-		description = S("Diamond Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_diamond.png",
-		groups = {armor_torso=1, armor_heal=12, armor_use=200},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
-	})
-	armor:register_armor("3d_armor:leggings_diamond", {
-		description = S("Diamond Leggings"),
-		inventory_image = "3d_armor_inv_leggings_diamond.png",
-		groups = {armor_legs=1, armor_heal=12, armor_use=200},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
-	})
-	armor:register_armor("3d_armor:boots_diamond", {
-		description = S("Diamond Boots"),
-		inventory_image = "3d_armor_inv_boots_diamond.png",
-		groups = {armor_feet=1, armor_heal=12, armor_use=200},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
-	})
-end
-
-if armor.materials.gold then
-	armor:register_armor("3d_armor:helmet_gold", {
-		description = S("Gold Helmet"),
-		inventory_image = "3d_armor_inv_helmet_gold.png",
-		groups = {armor_head=1, armor_heal=6, armor_use=300,
-			physics_speed=-0.02, physics_gravity=0.02},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
-	})
-	armor:register_armor("3d_armor:chestplate_gold", {
-		description = S("Gold Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_gold.png",
-		groups = {armor_torso=1, armor_heal=6, armor_use=300,
-			physics_speed=-0.05, physics_gravity=0.05},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
-	})
-	armor:register_armor("3d_armor:leggings_gold", {
-		description = S("Gold Leggings"),
-		inventory_image = "3d_armor_inv_leggings_gold.png",
-		groups = {armor_legs=1, armor_heal=6, armor_use=300,
-			physics_speed=-0.04, physics_gravity=0.04},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
-	})
-	armor:register_armor("3d_armor:boots_gold", {
-		description = S("Gold Boots"),
-		inventory_image = "3d_armor_inv_boots_gold.png",
-		groups = {armor_feet=1, armor_heal=6, armor_use=300,
-			physics_speed=-0.02, physics_gravity=0.02},
-		armor_groups = {fleshy=10},
-		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
-	})
-end
-
-if armor.materials.mithril then
-	armor:register_armor("3d_armor:helmet_mithril", {
-		description = S("Mithril Helmet"),
-		inventory_image = "3d_armor_inv_helmet_mithril.png",
-		groups = {armor_head=1, armor_heal=12, armor_use=100},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:chestplate_mithril", {
-		description = S("Mithril Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_mithril.png",
-		groups = {armor_torso=1, armor_heal=12, armor_use=100},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:leggings_mithril", {
-		description = S("Mithril Leggings"),
-		inventory_image = "3d_armor_inv_leggings_mithril.png",
-		groups = {armor_legs=1, armor_heal=12, armor_use=100},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:boots_mithril", {
-		description = S("Mithril Boots"),
-		inventory_image = "3d_armor_inv_boots_mithril.png",
-		groups = {armor_feet=1, armor_heal=12, armor_use=100},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-end
-
-if armor.materials.crystal then
-	armor:register_armor("3d_armor:helmet_crystal", {
-		description = S("Crystal Helmet"),
-		inventory_image = "3d_armor_inv_helmet_crystal.png",
-		groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:chestplate_crystal", {
-		description = S("Crystal Chestplate"),
-		inventory_image = "3d_armor_inv_chestplate_crystal.png",
-		groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:leggings_crystal", {
-		description = S("Crystal Leggings"),
-		inventory_image = "3d_armor_inv_leggings_crystal.png",
-		groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1},
-		armor_groups = {fleshy=20},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-	armor:register_armor("3d_armor:boots_crystal", {
-		description = S("Crystal Boots"),
-		inventory_image = "3d_armor_inv_boots_crystal.png",
-		groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1,
-				physics_jump=0.5, armor_fire=1},
-		armor_groups = {fleshy=15},
-		damage_groups = {cracky=2, snappy=1, level=3},
-	})
-end
-
-for k, v in pairs(armor.materials) do
-	minetest.register_craft({
-		output = "3d_armor:helmet_"..k,
-		recipe = {
-			{v, v, v},
-			{v, "", v},
-			{"", "", ""},
-		},
-	})
-	minetest.register_craft({
-		output = "3d_armor:chestplate_"..k,
-		recipe = {
-			{v, "", v},
-			{v, v, v},
-			{v, v, v},
-		},
-	})
-	minetest.register_craft({
-		output = "3d_armor:leggings_"..k,
-		recipe = {
-			{v, v, v},
-			{v, "", v},
-			{v, "", v},
-		},
-	})
-	minetest.register_craft({
-		output = "3d_armor:boots_"..k,
-		recipe = {
-			{v, "", v},
-			{v, "", v},
-		},
-	})
-end
diff --git a/3d_armor/crafting_guide.txt b/3d_armor/crafting_guide.txt
index abd1519..1a121d8 100644
--- a/3d_armor/crafting_guide.txt
+++ b/3d_armor/crafting_guide.txt
@@ -19,6 +19,7 @@ Helmets:
 [3d_armor:helmet_gold] X = [default:gold_ingot]
 [3d_armor:helmet_mithril] X = [moreores:mithril_ingot] *
 [3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] **
+[3d_armor:helmet_nether] X = [ethereal:nether_ingot] **
 
 Chestplates:
 
@@ -38,6 +39,7 @@ Chestplates:
 [3d_armor:chestplate_gold] X = [default:gold_ingot]
 [3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] *
 [3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] **
+[3d_armor:chestplate_nether] X = [ethereal:nether_ingot] **
 
 Leggings:
 
@@ -57,6 +59,7 @@ Leggings:
 [3d_armor:leggings_gold] X = [default:gold_ingot]
 [3d_armor:leggings_mithril] X = [moreores:mithril_ingot] *
 [3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] **
+[3d_armor:leggings_nether] X = [ethereal:nether_ingot] **
 
 Boots:
 
@@ -74,6 +77,8 @@ Boots:
 [3d_armor:boots_gold] X = [default:gold_ingot]
 [3d_armor:boots_mithril] X = [moreores:mithril_ingot] *
 [3d_armor:boots_crystal] X = [ethereal:crystal_ingot] **
+[3d_armor:boots_nether] X = [ethereal:nether_ingot] **
 
  * Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549
 ** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal
+** Requires nether mod - https://github.com/minetest-mods/nether.git
diff --git a/3d_armor/depends.txt b/3d_armor/depends.txt
index a33755d..1000772 100644
--- a/3d_armor/depends.txt
+++ b/3d_armor/depends.txt
@@ -5,4 +5,6 @@ pova?
 fire?
 ethereal?
 bakedclay?
-intllib?
+moreores?
+nether?
+3d_armor_steel?
\ No newline at end of file
diff --git a/3d_armor/init.lua b/3d_armor/init.lua
index e83bc10..eba28cd 100644
--- a/3d_armor/init.lua
+++ b/3d_armor/init.lua
@@ -5,19 +5,15 @@ 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")
+dofile(modpath.."/api.lua")
 
 -- local functions
-local S = armor_i18n.gettext
 local F = minetest.formspec_escape
-
-dofile(modpath.."/api.lua")
+local S = armor.get_translator
 
 -- integration test
 if minetest.settings:get_bool("enable_3d_armor_integration_test") then
-        dofile(modpath.."/integration_test.lua")
+	dofile(modpath.."/integration_test.lua")
 end
 
 
@@ -52,6 +48,8 @@ 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) == "string" then
+		setting = tostring(setting)
 	elseif type(config) == "boolean" then
 		setting = minetest.settings:get_bool("armor_"..name)
 	end
@@ -66,11 +64,26 @@ for material, _ in pairs(armor.materials) do
 	end
 end
 
+-- Convert set_elements to a Lua table splitting on blank spaces
+local t_set_elements = armor.config.set_elements
+armor.config.set_elements = string.split(t_set_elements, " ")
+
+-- Remove torch damage if fire_protect_torch == false
+if armor.config.fire_protect_torch == false and armor.config.fire_protect == true then
+	for k,v in pairs(armor.fire_nodes) do
+		for k2,v2 in pairs(v) do
+			if string.find (v2,"torch") then
+				armor.fire_nodes[k] = nil
+			end
+		end
+	end
+end
+
 -- Mod Compatibility
 
 if minetest.get_modpath("technic") then
 	armor.formspec = armor.formspec..
-		"label[5,2.5;"..F(S("Radiation"))..":  armor_group_radiation]"
+		"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"}
@@ -83,25 +96,18 @@ for _, mod in pairs(skin_mods) do
 				armor:add_preview(fn)
 			end
 		end
-		armor.skin_mod = mod
+		armor.set_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]"
+	"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]"
+	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()
@@ -197,6 +203,9 @@ local function init_player_armor(initplayer)
 			armor:set_player_armor(player)
 		end,
 		allow_put = function(inv, listname, index, put_stack, player)
+			if player:get_player_name() ~= name then
+				return 0
+			end
 			local element = armor:get_element(put_stack:get_name())
 			if not element then
 				return 0
@@ -212,9 +221,15 @@ local function init_player_armor(initplayer)
 			return 1
 		end,
 		allow_take = function(inv, listname, index, stack, player)
+			if player:get_player_name() ~= name then
+				return 0
+			end
 			return stack:get_count()
 		end,
 		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
+			if player:get_player_name() ~= name then
+				return 0
+			end
 			return count
 		end,
 	}, name)
@@ -274,7 +289,7 @@ end
 
 -- Armor Player Model
 
-default.player_register_model("3d_armor_character.b3d", {
+player_api.register_model("3d_armor_character.b3d", {
 	animation_speed = 30,
 	textures = {
 		armor.default_skin..".png",
@@ -296,27 +311,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 	if not name then
 		return
 	end
-  local player_name = player:get_player_name()
+	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)
+			armor:update_skin(player_name)
 		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()
+	local player_name = player:get_player_name()
 
 	minetest.after(0, function()
-    local pplayer = minetest.get_player_by_name(player_name)
+		-- TODO: Added in 7566ecc - What's the prupose?
+		local pplayer = minetest.get_player_by_name(player_name)
 		if pplayer and init_player_armor(pplayer) == false then
 			pending_players[pplayer] = 0
 		end
@@ -380,13 +389,20 @@ if armor.config.drop == true or armor.config.destroy == true then
 			end)
 		end
 	end)
+else -- reset un-dropped armor and it's effects
+	minetest.register_on_respawnplayer(function(player)
+		armor:set_player_armor(player)
+	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
+		local hit_ip = hitter:is_player()
+		if name and hit_ip and minetest.is_protected(player:get_pos(), "") then
+			return
+		elseif name then
 			armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
 			last_punch_time[name] = minetest.get_gametime()
 		end
@@ -414,80 +430,82 @@ 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
+
+	if armor.config.feather_fall == true then
+		for _,player in pairs(minetest.get_connected_players()) do
+			local name = player:get_player_name()
+			if armor.def[name].feather > 0 then
+				local vel_y = player:get_velocity().y
+				if vel_y < 0 and vel_y < 3 then
+					vel_y = -(vel_y * 0.05)
+					player:add_velocity({x = 0, y = vel_y, z = 0})
+				end
 			end
-			if remove == true then
-				pending_players[player] = nil
+		end
+	end
+
+	if timer <= armor.config.init_delay then
+		return
+	end
+	timer = 0
+
+	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
+
+	-- water breathing protection, added by TenPlus1
+	if armor.config.water_protect == true then
+		for _,player in pairs(minetest.get_connected_players()) do
+			local name = player:get_player_name()
+			if armor.def[name].water > 0 and
+					player:get_breath() < 10 then
+				player:set_breath(10)
 			end
 		end
-		timer = 0
 	end
 end)
 
--- Fire Protection and water breathing, added by TenPlus1.
-
+-- Fire Protection, added by TenPlus1.
 if armor.config.fire_protect == true then
-	-- override hot nodes so they do not hurt player anywhere but mod
+	-- override any hot nodes that do not already deal damage
 	for _, row in pairs(armor.fire_nodes) do
 		if minetest.registered_nodes[row[1]] then
-			minetest.override_item(row[1], {damage_per_second = 0})
+			local damage = minetest.registered_nodes[row[1]].damage_per_second
+			if not damage or damage == 0 then
+				minetest.override_item(row[1], {damage_per_second = row[3]})
+			end
 		end
 	end
 else
-	print (S("[3d_armor] Fire Nodes disabled"))
+	print ("[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
+if armor.config.fire_protect == true then
+	minetest.register_on_player_hpchange(function(player, hp_change, reason)
+
+		if reason.type == "node_damage" and reason.node then
 			-- 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
+			if armor.config.fire_protect == true and hp_change < 0 then
+				local name = player:get_player_name()
+				for _,igniter in pairs(armor.fire_nodes) do
+					if reason.node == igniter[1] then
+						if armor.def[name].fire < igniter[2] 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
+						else
+							hp_change = 0
 						end
 					end
 				end
 			end
 		end
-		armor.timer = 0
-	end)
+		return hp_change
+	end, true)
 end
diff --git a/3d_armor/intllib.lua b/3d_armor/intllib.lua
deleted file mode 100644
index 6669d72..0000000
--- a/3d_armor/intllib.lua
+++ /dev/null
@@ -1,45 +0,0 @@
-
--- 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
diff --git a/3d_armor/locale/3d_armor.de.tr b/3d_armor/locale/3d_armor.de.tr
new file mode 100644
index 0000000..a7eec48
--- /dev/null
+++ b/3d_armor/locale/3d_armor.de.tr
@@ -0,0 +1,19 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor : Abgetrennter Rüstungsbestand ist nicht gesetzt: @1
+3d_armor: Player name is nil @1=3d_armor : Spielername ist nicht gesetzt: @1
+3d_armor: Player reference is nil @1=3d_armor : Spielerreferenz ist nicht gesetzt: @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor : Initialisierung des Spielers fehlgeschlagen
+Fire=Feuer
+Heal=Heilen
+Level=Stufe
+Radiation=Strahlen
+Your @1 got destroyed!=Deine @1 wurde zerstört!
+Your @1 is almost broken!=Deine @1 ist fast kaputt!
+[3d_armor] Fire Nodes disabled=[3d_armor] Feuer-Knoten deaktiviert
diff --git a/3d_armor/locale/3d_armor.eo.tr b/3d_armor/locale/3d_armor.eo.tr
new file mode 100644
index 0000000..0b97918
--- /dev/null
+++ b/3d_armor/locale/3d_armor.eo.tr
@@ -0,0 +1,9 @@
+# textdomain: 3d_armor
+
+Radiation=Radiado
+Level=Nivelo
+Heal=Sanigi
+Fire=Fajro
+Your @1 is almost broken!=Via @1 estas preskaŭ rompita!
+Your @1 got destroyed!=Via @1 detruiĝis!
+3d_armor: Failed to initialize player=3d_armour: Malsukcesis pravalorigi la ludanton
diff --git a/3d_armor/locale/3d_armor.es.tr b/3d_armor/locale/3d_armor.es.tr
new file mode 100644
index 0000000..24c6c43
--- /dev/null
+++ b/3d_armor/locale/3d_armor.es.tr
@@ -0,0 +1,19 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: La armadura desconectada es nula @1
+3d_armor: Player name is nil @1=3d_armor: El nombre del jugador es nulo @1
+3d_armor: Player reference is nil @1=3d_armor: La referencia del jugador es nula @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: Fallo en la inicialización del jugador
+Fire=Fuego
+Heal=Salud
+Level=Nivel
+Radiation=Radiación
+Your @1 got destroyed!=¡Tu @1 fue destruído!
+Your @1 is almost broken!=¡Tu @1 esta a punto de romperse!
+[3d_armor] Fire Nodes disabled=[3d_armor] Nodos de fuego desabilitados
diff --git a/3d_armor/locale/3d_armor.fr.tr b/3d_armor/locale/3d_armor.fr.tr
new file mode 100644
index 0000000..b4d9564
--- /dev/null
+++ b/3d_armor/locale/3d_armor.fr.tr
@@ -0,0 +1,19 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor : Inventaire détaché pour l'armure non trouvé @1
+3d_armor: Player name is nil @1=3d_armor : Nom du joueur non trouvé @1
+3d_armor: Player reference is nil @1=3d_armor : Référence au joueur non trouvée @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor : Impossible d'initialiser le joueur
+Fire=Fire
+Heal=Soins
+Level=Niveau
+Radiation=Radiation
+Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 !
+Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 !
+[3d_armor] Fire Nodes disabled=[3d_armor] Nœuds de type feu désactivés
diff --git a/3d_armor/locale/3d_armor.it.tr b/3d_armor/locale/3d_armor.it.tr
new file mode 100644
index 0000000..b2fcf67
--- /dev/null
+++ b/3d_armor/locale/3d_armor.it.tr
@@ -0,0 +1,47 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: L'inventario separato dell'armatura è nullo @1
+3d_armor: Player name is nil @1=3d_armor: Il nome dell'utente è nullo @1
+3d_armor: Player reference is nil @1=3d_armor: Il riferimento all'utente è nullo @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: Inizializzazione dell'utente fallita
+Fire=Fuoco
+Heal=Guarigione
+Level=Livello
+Radiation=Radiazione
+Your @1 got destroyed!=@1 in frantumi!
+Your @1 is almost broken!=@1 quasi in frantumi!
+[3d_armor] Fire Nodes disabled=[3d_armor] Nodi fuoco disabilitati
+
+
+##### not used anymore #####
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod caricata ma inutilizzata.
+Back=Indietro
+Armor=Armatura
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod caricata ma inutilizzata.
+Armor stand top=Parte superiore del supporto per armatura
+Armor stand=Supporto per armatura
+Armor Stand=Supporto per armatura
+Locked Armor stand=Supporto per armatura chiuso a chiave
+Armor Stand (owned by @1)=Supporto per armatura (di proprietà di @1)
+3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod caricata ma inutilizzata.
+3d Armor=Armatura 3D
+Armor not initialized!=Armatura non inizializzata!
+Admin Shield=Scudo dell'amministratrice/tore
+Wooden Shield=Scudo di legno
+Enhanced Wood Shield=Scudo di legno migliorato
+Cactus Shield=Scudo di cactus
+Enhanced Cactus Shield=Scudo di cactus migliorato
+Steel Shield=Scudo d'acciaio
+Bronze Shield=Scudo di bronzo
+Diamond Shield=Scudo di diamante
+Gold Shield=Scudo d'oro
+Mithril Shield=Scudo di mithril
+Crystal Shield=Scudo di cristallo
+Nether Shield=Scudo di nether
diff --git a/3d_armor/locale/3d_armor.ms.tr b/3d_armor/locale/3d_armor.ms.tr
new file mode 100644
index 0000000..072a49a
--- /dev/null
+++ b/3d_armor/locale/3d_armor.ms.tr
@@ -0,0 +1,47 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: Inventori perisai terpisah tiada nilai @1
+3d_armor: Player name is nil @1=3d_armor: Nama pemain tiada nilai @1
+3d_armor: Player reference is nil @1=3d_armor: Rujukan pemain tiada nilai @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: Gagal mengasalkan pemain
+Fire=Api
+Heal=Pulih
+Level=Tahap
+Radiation=Radiasi
+Your @1 got destroyed!=@1 anda telah musnah!
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=[3d_armor] Nod-nod Api dilumpuhkan
+
+
+##### not used anymore #####
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mods dimuatkan tetapi tidak digunakan.
+Back=Kembali
+Armor=Perisai
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan.
+Armor stand top=Bhg atas dirian perisai
+Armor stand=Dirian perisai
+Armor Stand=Dirian Perisai
+Locked Armor stand=Dirian perisai Berkunci
+Armor Stand (owned by @1)=Dirian Perisai (milik @1)
+3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mods dimuatkan tetapi tidak digunakan.
+3d Armor=Perisai 3d
+Armor not initialized!=Perisai tidak diasalkan!
+Admin Shield=Perisai Pegang Pentadbir
+Wooden Shield=Perisai Pegang Kayu
+Enhanced Wood Shield=Perisai Pegang Kayu Kukuh
+Cactus Shield=Perisai Pegang Kaktus
+Enhanced Cactus Shield=Perisai Pegang Kaktus Kukuh
+Steel Shield=Perisai Pegang Keluli
+Bronze Shield=Perisai Pegang Gangsa
+Diamond Shield=Perisai Pegang Intan
+Gold Shield=Perisai Pegang Emas
+Mithril Shield=Perisai Pegang Mithril
+Crystal Shield=Perisai Pegang Kristal
+Nether Shield=Perisai Pegang Nether
diff --git a/3d_armor/locale/3d_armor.pt.tr b/3d_armor/locale/3d_armor.pt.tr
new file mode 100644
index 0000000..143e62b
--- /dev/null
+++ b/3d_armor/locale/3d_armor.pt.tr
@@ -0,0 +1,47 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1
+3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1
+3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador
+Fire=Fogo
+Heal=Saúde
+Level=Nível
+Radiation=Radiação
+Your @1 got destroyed!=@1 foi destruído(a)!
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados
+
+
+##### not used anymore #####
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante.
+Back=Voltar
+Armor=Armadura
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante.
+Armor stand top=Topo de estande de armadura
+Armor stand=Estande de armadura
+Armor Stand=Estande de Armadura
+Locked Armor stand=Estande de Armadura Trancada
+Armor Stand (owned by @1)=Estande de Armadura (pertente a @1)
+3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante.
+3d Armor=3d Armor
+Armor not initialized!=Armadura não inicializada!
+Admin Shield=Escudo de Administrador
+Wooden Shield=Escudo de Madeira
+Enhanced Wood Shield=Escudo de Madeira Melhorado
+Cactus Shield=Escudo de Cacto
+Enhanced Cactus Shield=Escudo de Cacto Melhorado
+Steel Shield=Escudo de Aço
+Bronze Shield=Escudo de Bronze
+Diamond Shield=Escudo de Diamante
+Gold Shield=Escudo de Ouro
+Mithril Shield=Escudo de Mithril
+Crystal Shield=Escudo de Cristal
+Nether Shield=Escudo de Nether
diff --git a/3d_armor/locale/3d_armor.pt_BR.tr b/3d_armor/locale/3d_armor.pt_BR.tr
new file mode 100644
index 0000000..143e62b
--- /dev/null
+++ b/3d_armor/locale/3d_armor.pt_BR.tr
@@ -0,0 +1,47 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1
+3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1
+3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador
+Fire=Fogo
+Heal=Saúde
+Level=Nível
+Radiation=Radiação
+Your @1 got destroyed!=@1 foi destruído(a)!
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados
+
+
+##### not used anymore #####
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante.
+Back=Voltar
+Armor=Armadura
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante.
+Armor stand top=Topo de estande de armadura
+Armor stand=Estande de armadura
+Armor Stand=Estande de Armadura
+Locked Armor stand=Estande de Armadura Trancada
+Armor Stand (owned by @1)=Estande de Armadura (pertente a @1)
+3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante.
+3d Armor=3d Armor
+Armor not initialized!=Armadura não inicializada!
+Admin Shield=Escudo de Administrador
+Wooden Shield=Escudo de Madeira
+Enhanced Wood Shield=Escudo de Madeira Melhorado
+Cactus Shield=Escudo de Cacto
+Enhanced Cactus Shield=Escudo de Cacto Melhorado
+Steel Shield=Escudo de Aço
+Bronze Shield=Escudo de Bronze
+Diamond Shield=Escudo de Diamante
+Gold Shield=Escudo de Ouro
+Mithril Shield=Escudo de Mithril
+Crystal Shield=Escudo de Cristal
+Nether Shield=Escudo de Nether
diff --git a/3d_armor/locale/3d_armor.ru.tr b/3d_armor/locale/3d_armor.ru.tr
new file mode 100644
index 0000000..0072b4c
--- /dev/null
+++ b/3d_armor/locale/3d_armor.ru.tr
@@ -0,0 +1,46 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=3d_armor: Отдельный инвентарь брони является nil @1
+3d_armor: Player name is nil @1=3d_armor: Имя игрока является nil @1
+3d_armor: Player reference is nil @1=3d_armor: Ссылка игрока является nil @1
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=3d_armor: не смог подготовить игрока
+Fire=огонь
+Heal=исцеление
+Level=уровень
+Radiation=излучение
+Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)!
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=[3d_armor] блоки огня отключены
+
+
+##### not used anymore #####
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: мод загружен но не используется.
+Back=назад
+Armor=бронь
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: мод загружен но не используется.
+Armor stand top=стойка для брони (верх)
+Armor stand=стойка для брони
+Armor Stand=стойка для брони
+Locked Armor stand=защищенная стойка для брони
+Armor Stand (owned by @1)=стойка для брони (принадлежит @1)
+3d_armor_ui: Mod loaded but unused.=3d_armor_ui: мод загружен но не используется.
+3d Armor=3D бронь
+Armor not initialized!=бронь не подготовлена!
+Admin Shield=щит админа
+Wooden Shield=деревянный щит
+Enhanced Wood Shield=улучшенный деревянный щит
+Cactus Shield=кактусный щит
+Enhanced Cactus Shield=улучшенный кактусный щит
+Steel Shield=стальной щит
+Bronze Shield=бронзовый щит
+Diamond Shield=алмазный щит
+Gold Shield=золотой щит
+Mithril Shield=мифриловый щит
+Crystal Shield=кристалловый щит
diff --git a/3d_armor/locale/es.po b/3d_armor/locale/es.po
deleted file mode 100644
index 8eeaf6e..0000000
--- a/3d_armor/locale/es.po
+++ /dev/null
@@ -1,384 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/fr.po b/3d_armor/locale/fr.po
deleted file mode 100644
index f2d258f..0000000
--- a/3d_armor/locale/fr.po
+++ /dev/null
@@ -1,295 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/it.po b/3d_armor/locale/it.po
deleted file mode 100644
index 5d6f46b..0000000
--- a/3d_armor/locale/it.po
+++ /dev/null
@@ -1,295 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/ms.po b/3d_armor/locale/ms.po
deleted file mode 100644
index 518e438..0000000
--- a/3d_armor/locale/ms.po
+++ /dev/null
@@ -1,296 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/pt.po b/3d_armor/locale/pt.po
deleted file mode 100644
index 0166637..0000000
--- a/3d_armor/locale/pt.po
+++ /dev/null
@@ -1,295 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/pt_BR.po b/3d_armor/locale/pt_BR.po
deleted file mode 100644
index b429d11..0000000
--- a/3d_armor/locale/pt_BR.po
+++ /dev/null
@@ -1,295 +0,0 @@
-# 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"
diff --git a/3d_armor/locale/ru.po b/3d_armor/locale/ru.po
deleted file mode 100644
index 4beee8a..0000000
--- a/3d_armor/locale/ru.po
+++ /dev/null
@@ -1,294 +0,0 @@
-# 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 "кристалловый щит"
diff --git a/3d_armor/locale/template.pot b/3d_armor/locale/template.pot
deleted file mode 100644
index 0b0222c..0000000
--- a/3d_armor/locale/template.pot
+++ /dev/null
@@ -1,294 +0,0 @@
-# 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 ""
diff --git a/3d_armor/locale/template.txt b/3d_armor/locale/template.txt
new file mode 100644
index 0000000..ed6f81f
--- /dev/null
+++ b/3d_armor/locale/template.txt
@@ -0,0 +1,19 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=
+3d_armor: Player name is nil @1=
+3d_armor: Player reference is nil @1=
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=
+Fire=
+Heal=
+Level=
+Radiation=
+Your @1 got destroyed!=
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=
diff --git a/3d_armor/mod.conf b/3d_armor/mod.conf
index 56f7973..217c11b 100644
--- a/3d_armor/mod.conf
+++ b/3d_armor/mod.conf
@@ -1,4 +1,4 @@
 name = 3d_armor
-depends = default
-optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, intllib
+depends = default, player_api
+optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores, nether
 description = Adds craftable armor that is visible to other players.
diff --git a/3d_armor/textures/3d_armor_ui_form.png b/3d_armor/textures/3d_armor_ui_form.png
deleted file mode 100644
index 993809f..0000000
Binary files a/3d_armor/textures/3d_armor_ui_form.png and /dev/null differ
diff --git a/3d_armor/textures/preview_index.txt b/3d_armor/textures/preview_index.txt
deleted file mode 100644
index 9e2fe9d..0000000
--- a/3d_armor/textures/preview_index.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-3d_armor/textures/3d_armor_helmet_wood.png:head
-3d_armor/textures/3d_armor_chestplate_wood.png:torso
-3d_armor/textures/3d_armor_leggings_wood.png:legs
-3d_armor/textures/3d_armor_boots_wood.png:feet
-
-3d_armor/textures/3d_armor_helmet_cactus.png:head
-3d_armor/textures/3d_armor_chestplate_cactus.png:torso
-3d_armor/textures/3d_armor_leggings_cactus.png:legs
-3d_armor/textures/3d_armor_boots_cactus.png:feet
-
-3d_armor/textures/3d_armor_helmet_steel.png:head
-3d_armor/textures/3d_armor_chestplate_steel.png:torso
-3d_armor/textures/3d_armor_leggings_steel.png:legs
-3d_armor/textures/3d_armor_boots_steel.png:feet
-
-3d_armor/textures/3d_armor_helmet_bronze.png:head
-3d_armor/textures/3d_armor_chestplate_bronze.png:torso
-3d_armor/textures/3d_armor_leggings_bronze.png:legs
-3d_armor/textures/3d_armor_boots_bronze.png:feet
-
-3d_armor/textures/3d_armor_helmet_gold.png:head
-3d_armor/textures/3d_armor_chestplate_gold.png:torso
-3d_armor/textures/3d_armor_leggings_gold.png:legs
-3d_armor/textures/3d_armor_boots_gold.png:feet
-
-3d_armor/textures/3d_armor_helmet_diamond.png:head
-3d_armor/textures/3d_armor_chestplate_diamond.png:torso
-3d_armor/textures/3d_armor_leggings_diamond.png:legs
-3d_armor/textures/3d_armor_boots_diamond.png:feet
-
-3d_armor/textures/3d_armor_helmet_mithril.png:head
-3d_armor/textures/3d_armor_chestplate_mithril.png:torso
-3d_armor/textures/3d_armor_leggings_mithril.png:legs
-3d_armor/textures/3d_armor_boots_mithril.png:feet
-
-3d_armor/textures/3d_armor_helmet_crystal.png:head
-3d_armor/textures/3d_armor_chestplate_crystal.png:torso
-3d_armor/textures/3d_armor_leggings_crystal.png:legs
-3d_armor/textures/3d_armor_boots_crystal.png:feet
-
-3d_armor/textures/3d_armor_helmet_admin.png:head
-3d_armor/textures/3d_armor_chestplate_admin.png:torso
-3d_armor/textures/3d_armor_leggings_admin.png:legs
-3d_armor/textures/3d_armor_boots_admin.png:feet
diff --git a/3d_armor_ip/init.lua b/3d_armor_ip/init.lua
index 7701a70..f061200 100644
--- a/3d_armor_ip/init.lua
+++ b/3d_armor_ip/init.lua
@@ -1,5 +1,5 @@
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 local F = minetest.formspec_escape
 
 if not minetest.global_exists("inventory_plus") then
diff --git a/3d_armor_ip/locale/3d_armor_ip.eo.tr b/3d_armor_ip/locale/3d_armor_ip.eo.tr
new file mode 100644
index 0000000..5e61d42
--- /dev/null
+++ b/3d_armor_ip/locale/3d_armor_ip.eo.tr
@@ -0,0 +1,5 @@
+# textdomain: 3d_armor_ip
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod ŝarĝita sed neuzata.
+Back=Dorso
+Armor=Kiraso
diff --git a/3d_armor_ip/locale/3d_armor_ip.fr.tr b/3d_armor_ip/locale/3d_armor_ip.fr.tr
new file mode 100644
index 0000000..5f540b1
--- /dev/null
+++ b/3d_armor_ip/locale/3d_armor_ip.fr.tr
@@ -0,0 +1,8 @@
+# textdomain: 3d_armor_ip
+
+
+### init.lua ###
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip : Mod chargé mais inutilisé.
+Armor=Armure
+Back=Retour
diff --git a/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr b/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr
new file mode 100644
index 0000000..15ca9e8
--- /dev/null
+++ b/3d_armor_ip/locale/3d_armor_ip.pt_BR.tr
@@ -0,0 +1,8 @@
+# textdomain: 3d_armor_ip
+
+
+### init.lua ###
+
+3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado porém sem uso.
+Armor=Armadura
+Back=Voltar
diff --git a/3d_armor_ip/locale/template.txt b/3d_armor_ip/locale/template.txt
new file mode 100644
index 0000000..133bce8
--- /dev/null
+++ b/3d_armor_ip/locale/template.txt
@@ -0,0 +1,8 @@
+# textdomain: 3d_armor_ip
+
+
+### init.lua ###
+
+3d_armor_ip: Mod loaded but unused.=
+Armor=
+Back=
diff --git a/3d_armor_sfinv/init.lua b/3d_armor_sfinv/init.lua
index a937127..830ebbc 100644
--- a/3d_armor_sfinv/init.lua
+++ b/3d_armor_sfinv/init.lua
@@ -1,5 +1,5 @@
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 
 if not minetest.global_exists("sfinv") then
 	minetest.log("warning", S("3d_armor_sfinv: Mod loaded but unused."))
diff --git a/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr b/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr
new file mode 100644
index 0000000..7927af1
--- /dev/null
+++ b/3d_armor_sfinv/locale/3d_armor_sfinv.eo.tr
@@ -0,0 +1,4 @@
+# textdomain: 3d_armor_sfinv
+
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod ŝarĝita sed neuzata.
+Armor=Kiraso
diff --git a/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr b/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr
new file mode 100644
index 0000000..ee72e52
--- /dev/null
+++ b/3d_armor_sfinv/locale/3d_armor_sfinv.es.tr
@@ -0,0 +1,7 @@
+# textdomain: 3d_armor_sfinv
+
+
+### init.lua ###
+
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod cargado pero no activado.
+Armor=Armadura
diff --git a/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr b/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr
new file mode 100644
index 0000000..f25bd11
--- /dev/null
+++ b/3d_armor_sfinv/locale/3d_armor_sfinv.fr.tr
@@ -0,0 +1,7 @@
+# textdomain: 3d_armor_sfinv
+
+
+### init.lua ###
+
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv : Mod chargé mais inutilisé.
+Armor=Armure
diff --git a/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr b/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr
new file mode 100644
index 0000000..b5f0577
--- /dev/null
+++ b/3d_armor_sfinv/locale/3d_armor_sfinv.pt_BR.tr
@@ -0,0 +1,7 @@
+# textdomain: 3d_armor_sfinv
+
+
+### init.lua ###
+
+3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado porém sem uso.
+Armor=Armadura
diff --git a/3d_armor_sfinv/locale/template.txt b/3d_armor_sfinv/locale/template.txt
new file mode 100644
index 0000000..a3f01b5
--- /dev/null
+++ b/3d_armor_sfinv/locale/template.txt
@@ -0,0 +1,7 @@
+# textdomain: 3d_armor_sfinv
+
+
+### init.lua ###
+
+3d_armor_sfinv: Mod loaded but unused.=
+Armor=
diff --git a/3d_armor_stand/init.lua b/3d_armor_stand/init.lua
index ab4549b..612345b 100644
--- a/3d_armor_stand/init.lua
+++ b/3d_armor_stand/init.lua
@@ -1,5 +1,5 @@
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 
 local armor_stand_formspec = "size[8,7]" ..
 	default.gui_bg ..
@@ -153,6 +153,7 @@ minetest.register_node("3d_armor_stand:armor_stand", {
 	drawtype = "mesh",
 	mesh = "3d_armor_stand.obj",
 	tiles = {"3d_armor_stand.png"},
+	use_texture_alpha = "clip",
 	paramtype = "light",
 	paramtype2 = "facedir",
 	walkable = false,
@@ -221,6 +222,7 @@ minetest.register_node("3d_armor_stand:locked_armor_stand", {
 	drawtype = "mesh",
 	mesh = "3d_armor_stand.obj",
 	tiles = {"3d_armor_stand_locked.png"},
+	use_texture_alpha = "clip",
 	paramtype = "light",
 	paramtype2 = "facedir",
 	walkable = false,
diff --git a/3d_armor_stand/locale/3d_armor_stand.eo.tr b/3d_armor_stand/locale/3d_armor_stand.eo.tr
new file mode 100644
index 0000000..1e871e9
--- /dev/null
+++ b/3d_armor_stand/locale/3d_armor_stand.eo.tr
@@ -0,0 +1,7 @@
+# textdomain: 3d_armor_stand
+
+Armor stand top=Kirasstando supro
+Armor stand=Kirasstando
+Armor Stand=Kirasstando
+Locked Armor stand=Ŝlosita Kirasstando
+Armor Stand (owned by @1)=Kirasstando (posedata de @1)
diff --git a/3d_armor_stand/locale/3d_armor_stand.fr.tr b/3d_armor_stand/locale/3d_armor_stand.fr.tr
new file mode 100644
index 0000000..7d4cd38
--- /dev/null
+++ b/3d_armor_stand/locale/3d_armor_stand.fr.tr
@@ -0,0 +1,10 @@
+# textdomain: 3d_armor_stand
+
+
+### init.lua ###
+
+Armor Stand=Support d'armure
+Armor Stand (owned by @1)=Support d'armure (propriété de @1)
+Armor stand=Support d'armure
+Armor stand top=Haut de support d'armure
+Locked Armor stand=Support d'armure verrouillé
diff --git a/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr b/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr
new file mode 100644
index 0000000..85fe983
--- /dev/null
+++ b/3d_armor_stand/locale/3d_armor_stand.pt_BR.tr
@@ -0,0 +1,10 @@
+# textdomain: 3d_armor_stand
+
+
+### init.lua ###
+
+Armor Stand=Suporte de Armadura
+Armor Stand (owned by @1)=Suporte de Armadura (dono: @1)
+Armor stand=Suporte de armadura
+Armor stand top=Topo do suporte de armadura
+Locked Armor stand=Suporte de armadura trancado
diff --git a/3d_armor_stand/locale/template.txt b/3d_armor_stand/locale/template.txt
new file mode 100644
index 0000000..25befcb
--- /dev/null
+++ b/3d_armor_stand/locale/template.txt
@@ -0,0 +1,10 @@
+# textdomain: 3d_armor_stand
+
+
+### init.lua ###
+
+Armor Stand=
+Armor Stand (owned by @1)=
+Armor stand=
+Armor stand top=
+Locked Armor stand=
diff --git a/3d_armor_ui/init.lua b/3d_armor_ui/init.lua
index 41eec7b..28193e7 100644
--- a/3d_armor_ui/init.lua
+++ b/3d_armor_ui/init.lua
@@ -1,14 +1,15 @@
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 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."))
+	minetest.log("warning", "3d_armor_ui: Mod loaded but unused.")
 	return
 end
 
-if unified_inventory.sfinv_compat_layer then
+local ui = unified_inventory
+if ui.sfinv_compat_layer then
 	return
 end
 
@@ -27,25 +28,32 @@ unified_inventory.register_button("armor", {
 
 unified_inventory.register_page("armor", {
 	get_formspec = function(player, perplayer_formspec)
-		local fy = perplayer_formspec.formspec_y
+		local fy = perplayer_formspec.form_header_y + 0.5
+		local gridx = perplayer_formspec.std_inv_x
+		local gridy = 0.6
+
 		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.."]"..
+		local formspec = perplayer_formspec.standard_inv_bg..
+			perplayer_formspec.standard_inv..
+			ui.make_inv_img_grid(gridx, gridy, 2, 3)..
+			string.format("label[%f,%f;%s]",
+				perplayer_formspec.form_header_x, perplayer_formspec.form_header_y, F(S("Armor")))..
+			string.format("list[detached:%s_armor;armor;%f,%f;2,3;]",
+				name, gridx + ui.list_img_offset, gridy + ui.list_img_offset) ..
+			"image[3.5,"..(fy - 0.25)..";2,4;"..armor.textures[name].preview.."]"..
+			"label[6.0,"..(fy + 0.0)..";"..F(S("Level"))..": "..armor.def[name].level.."]"..
+			"label[6.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)..";"..
+			formspec = formspec.."label[6.0,"..(fy + 1.0)..";"..
 				F(S("Fire"))..":  "..armor.def[name].fire.."]"
 		end
 		if has_technic then
-			formspec = formspec.."label[5.0,"..(fy + 1.5)..";"..
+			formspec = formspec.."label[6.0,"..(fy + 1.5)..";"..
 				F(S("Radiation"))..":  "..armor.def[name].groups["radiation"].."]"
 		end
 		return {formspec=formspec}
diff --git a/3d_armor_ui/locale/3d_armor_ui.eo.tr b/3d_armor_ui/locale/3d_armor_ui.eo.tr
new file mode 100644
index 0000000..cc4b5fb
--- /dev/null
+++ b/3d_armor_ui/locale/3d_armor_ui.eo.tr
@@ -0,0 +1,9 @@
+# textdomain: 3d_armor_ui
+
+3d Armor= 3D Kiraso
+Armor not initialized!=Kiraso ne pravigita!
+Armor=Kiraso
+Level=Nivelo
+Heal=Sanigi
+Fire=Fajro
+Radiation=Radiado
diff --git a/3d_armor_ui/locale/3d_armor_ui.fr.tr b/3d_armor_ui/locale/3d_armor_ui.fr.tr
new file mode 100644
index 0000000..38e0f05
--- /dev/null
+++ b/3d_armor_ui/locale/3d_armor_ui.fr.tr
@@ -0,0 +1,12 @@
+# textdomain: 3d_armor_ui
+
+
+### init.lua ###
+
+3d Armor=Armure 3d
+Armor=Armure
+Armor not initialized!=Armure non initialisée !
+Fire=Feu
+Heal=Soins
+Level=Niveau
+Radiation=Radiation
diff --git a/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr b/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr
new file mode 100644
index 0000000..b85f8af
--- /dev/null
+++ b/3d_armor_ui/locale/3d_armor_ui.pt_BR.tr
@@ -0,0 +1,12 @@
+# textdomain: 3d_armor_ui
+
+
+### init.lua ###
+
+3d Armor=3d Armor
+Armor=Armadura
+Armor not initialized!=Armadura não inicializada!
+Fire=Fogo
+Heal=Vida
+Level=Nível
+Radiation=Radiação
diff --git a/3d_armor_ui/locale/template.txt b/3d_armor_ui/locale/template.txt
new file mode 100644
index 0000000..0f7a8cb
--- /dev/null
+++ b/3d_armor_ui/locale/template.txt
@@ -0,0 +1,12 @@
+# textdomain: 3d_armor_ui
+
+
+### init.lua ###
+
+3d Armor=
+Armor=
+Armor not initialized!=
+Fire=
+Heal=
+Level=
+Radiation=
diff --git a/3d_armor_ui/mod.conf b/3d_armor_ui/mod.conf
index 68eff85..331627e 100644
--- a/3d_armor_ui/mod.conf
+++ b/3d_armor_ui/mod.conf
@@ -2,3 +2,4 @@ name = 3d_armor_ui
 depends = 3d_armor
 optional_depends = unified_inventory
 description = Adds 3d_armor page to the unified inventory.
+min_minetest_version = 5.4.0
diff --git a/README.md b/README.md
index 7bfefc0..3655e33 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 Modpack - 3d Armor [0.4.13]
 ===========================
+![3d_armor screenshot](https://github.com/minetest-mods/3d_armor/blob/master/screenshot.png)
+
 
 ![](https://github.com/minetest-mods/3d_armor/workflows/luacheck/badge.svg)
 ![](https://github.com/minetest-mods/3d_armor/workflows/integration-test/badge.svg)
@@ -49,6 +51,8 @@ see armor.conf.example for all available options.
 
 For mod installation instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods
 
+[API Reference](https://minetest-mods.github.io/3d_armor/reference/)
+
 [mod] Visible Wielded Items [wieldview]
 ---------------------------------------
 
diff --git a/armor_admin/LICENSE.txt b/armor_admin/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_admin/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_admin/depends.txt b/armor_admin/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_admin/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_admin/description.txt b/armor_admin/description.txt
new file mode 100644
index 0000000..44a0894
--- /dev/null
+++ b/armor_admin/description.txt
@@ -0,0 +1 @@
+Adds admin armor.
\ No newline at end of file
diff --git a/armor_admin/init.lua b/armor_admin/init.lua
new file mode 100644
index 0000000..9b94fcc
--- /dev/null
+++ b/armor_admin/init.lua
@@ -0,0 +1,94 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Admin Helmet
+--
+--  @helmet 3d_armor:helmet_admin
+--  @img 3d_armor_inv_helmet_admin.png
+--  @grp armor_head 1
+--  @grp armor_heal 100
+--  @grp armor_use 0
+--  @grp armor_water 1
+--  @grp not_in_creative_inventory 1
+--  @armorgrp fleshy 100
+armor:register_armor(":3d_armor:helmet_admin", {
+	description = S("Admin Helmet"),
+	inventory_image = "3d_armor_inv_helmet_admin.png",
+	armor_groups = {fleshy=100},
+	groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1,
+			not_in_creative_inventory=1},
+	on_drop = function(itemstack, dropper, pos)
+		return
+	end,
+})
+
+--- Admin Chestplate
+--
+--  @chestplate 3d_armor:chestplate_admin
+--  @img 3d_armor_inv_chestplate_admin.png
+--  @grp armor_torso 1
+--  @grp armor_heal 100
+--  @grp armor_use 0
+--  @grp not_in_creative_inventory 1
+--  @armorgrp fleshy 100
+armor:register_armor(":3d_armor:chestplate_admin", {
+	description = S("Admin Chestplate"),
+	inventory_image = "3d_armor_inv_chestplate_admin.png",
+	armor_groups = {fleshy=100},
+	groups = {armor_torso=1, armor_heal=100, armor_use=0,
+			not_in_creative_inventory=1},
+	on_drop = function(itemstack, dropper, pos)
+		return
+	end,
+})
+
+--- Admin Leggings
+--
+--  @leggings 3d_armor:leggings_admin
+--  @img 3d_armor_inv_leggings_admin.png
+--  @grp armor_legs 1
+--  @grp armor_heal 100
+--  @grp armor_use 0
+--  @grp not_in_creative_inventory 1
+--  @armorgrp fleshy 100
+armor:register_armor(":3d_armor:leggings_admin", {
+	description = S("Admin Leggings"),
+	inventory_image = "3d_armor_inv_leggings_admin.png",
+	armor_groups = {fleshy=100},
+	groups = {armor_legs=1, armor_heal=100, armor_use=0,
+			not_in_creative_inventory=1},
+	on_drop = function(itemstack, dropper, pos)
+		return
+	end,
+})
+
+--- Admin Boots
+--
+--  @boots 3d_armor:boots_admin
+--  @img 3d_armor_inv_boots_admin.png
+--  @grp armor_feet 1
+--  @grp armor_heal 100
+--  @grp armor_use 0
+--  @grp not_in_creative_inventory 1
+--  @armorgrp fleshy 100
+armor:register_armor(":3d_armor:boots_admin", {
+	description = S("Admin Boots"),
+	inventory_image = "3d_armor_inv_boots_admin.png",
+	armor_groups = {fleshy=100},
+	groups = {armor_feet=1, armor_heal=100, armor_use=0,
+			not_in_creative_inventory=1},
+	on_drop = function(itemstack, dropper, pos)
+		return
+	end,
+})
+
+minetest.register_alias("adminboots", "3d_armor:boots_admin")
+minetest.register_alias("adminhelmet", "3d_armor:helmet_admin")
+minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin")
+minetest.register_alias("adminleggings", "3d_armor:leggings_admin")
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.de.tr b/armor_admin/locale/armor_admin.de.tr
new file mode 100644
index 0000000..5d047f4
--- /dev/null
+++ b/armor_admin/locale/armor_admin.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=Adminstiefel
+Admin Chestplate=Adminbrustplatte
+Admin Helmet=Adminhelm
+Admin Leggings=Adminhose
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.eo.tr b/armor_admin/locale/armor_admin.eo.tr
new file mode 100644
index 0000000..9e21283
--- /dev/null
+++ b/armor_admin/locale/armor_admin.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_admin
+
+Admin Helmet=Administra Kasko
+Admin Chestplate=Administra Brustkiraso
+Admin Leggings=Administra Pantalono
+Admin Boots=Administra Botoj
diff --git a/armor_admin/locale/armor_admin.es.tr b/armor_admin/locale/armor_admin.es.tr
new file mode 100644
index 0000000..e925290
--- /dev/null
+++ b/armor_admin/locale/armor_admin.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=Botas de admin
+Admin Chestplate=Peto de admin
+Admin Helmet=Casco de admin
+Admin Leggings=Grebas de admin
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.fr.tr b/armor_admin/locale/armor_admin.fr.tr
new file mode 100644
index 0000000..7259265
--- /dev/null
+++ b/armor_admin/locale/armor_admin.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=Bottes d'admin
+Admin Chestplate=Cuirasse d'admin
+Admin Helmet=Casque d'admin
+Admin Leggings=Jambières d'admin
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.it.tr b/armor_admin/locale/armor_admin.it.tr
new file mode 100644
index 0000000..d742cc0
--- /dev/null
+++ b/armor_admin/locale/armor_admin.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=Stivali dell'amministratrice/tore
+Admin Chestplate=Corazza dell'amministratrice/tore
+Admin Helmet=Elmo dell'amministratrice/tore
+Admin Leggings=Gambali dell'amministratrice/tore
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.ms.tr b/armor_admin/locale/armor_admin.ms.tr
new file mode 100644
index 0000000..99e4921
--- /dev/null
+++ b/armor_admin/locale/armor_admin.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=But Pentadbir
+Admin Chestplate=Perisai Dada Pentadbir
+Admin Helmet=Helmet Pentadbir
+Admin Leggings=Perisai Kaki Pentadbir
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.pt.tr b/armor_admin/locale/armor_admin.pt.tr
new file mode 100644
index 0000000..d9e3cab
--- /dev/null
+++ b/armor_admin/locale/armor_admin.pt.tr
@@ -0,0 +1,13 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Steel Boots=Botas de Aço
+Steel Chestplate=Peitoral de Aço
+Steel Helmet=Capacete de Aço
+Steel Leggings=Calças de Aço
+Wood Boots=Botas de Madeira
+Wood Chestplate=Peitoral de Madeira
+Wood Helmet=Capacete de Madeira
+Wood Leggings=Calças de Madeira
diff --git a/armor_admin/locale/armor_admin.pt_BR.tr b/armor_admin/locale/armor_admin.pt_BR.tr
new file mode 100644
index 0000000..cc3dcf0
--- /dev/null
+++ b/armor_admin/locale/armor_admin.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=Botas de Administrador
+Admin Chestplate=Peitoral de Administrador
+Admin Helmet=Capacete de Administrador
+Admin Leggings=Calças de Administrador
\ No newline at end of file
diff --git a/armor_admin/locale/armor_admin.ru.tr b/armor_admin/locale/armor_admin.ru.tr
new file mode 100644
index 0000000..d25f58c
--- /dev/null
+++ b/armor_admin/locale/armor_admin.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=ботинки админа
+Admin Chestplate=бронежилет админа
+Admin Helmet=шлем админа
+Admin Leggings=гамаши админа
\ No newline at end of file
diff --git a/armor_admin/locale/template.txt b/armor_admin/locale/template.txt
new file mode 100644
index 0000000..4b98bb6
--- /dev/null
+++ b/armor_admin/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_admin
+
+
+### init.lua ###
+
+Admin Boots=
+Admin Chestplate=
+Admin Helmet=
+Admin Leggings=
\ No newline at end of file
diff --git a/armor_admin/mod.conf b/armor_admin/mod.conf
new file mode 100644
index 0000000..588d4a4
--- /dev/null
+++ b/armor_admin/mod.conf
@@ -0,0 +1,3 @@
+name = armor_admin
+depends = 3d_armor
+description = Adds admin armor.
diff --git a/3d_armor/textures/3d_armor_boots_admin.png b/armor_admin/textures/3d_armor_boots_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_admin.png
rename to armor_admin/textures/3d_armor_boots_admin.png
diff --git a/3d_armor/textures/3d_armor_boots_admin_preview.png b/armor_admin/textures/3d_armor_boots_admin_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_admin_preview.png
rename to armor_admin/textures/3d_armor_boots_admin_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_admin.png b/armor_admin/textures/3d_armor_chestplate_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_admin.png
rename to armor_admin/textures/3d_armor_chestplate_admin.png
diff --git a/3d_armor/textures/3d_armor_chestplate_admin_preview.png b/armor_admin/textures/3d_armor_chestplate_admin_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_admin_preview.png
rename to armor_admin/textures/3d_armor_chestplate_admin_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_admin.png b/armor_admin/textures/3d_armor_helmet_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_admin.png
rename to armor_admin/textures/3d_armor_helmet_admin.png
diff --git a/3d_armor/textures/3d_armor_helmet_admin_preview.png b/armor_admin/textures/3d_armor_helmet_admin_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_admin_preview.png
rename to armor_admin/textures/3d_armor_helmet_admin_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_admin.png b/armor_admin/textures/3d_armor_inv_boots_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_admin.png
rename to armor_admin/textures/3d_armor_inv_boots_admin.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_admin.png b/armor_admin/textures/3d_armor_inv_chestplate_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_admin.png
rename to armor_admin/textures/3d_armor_inv_chestplate_admin.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_admin.png b/armor_admin/textures/3d_armor_inv_helmet_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_admin.png
rename to armor_admin/textures/3d_armor_inv_helmet_admin.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_admin.png b/armor_admin/textures/3d_armor_inv_leggings_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_admin.png
rename to armor_admin/textures/3d_armor_inv_leggings_admin.png
diff --git a/3d_armor/textures/3d_armor_leggings_admin.png b/armor_admin/textures/3d_armor_leggings_admin.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_admin.png
rename to armor_admin/textures/3d_armor_leggings_admin.png
diff --git a/3d_armor/textures/3d_armor_leggings_admin_preview.png b/armor_admin/textures/3d_armor_leggings_admin_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_admin_preview.png
rename to armor_admin/textures/3d_armor_leggings_admin_preview.png
diff --git a/armor_bronze/LICENSE.txt b/armor_bronze/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_bronze/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_bronze/depends.txt b/armor_bronze/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_bronze/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_bronze/description.txt b/armor_bronze/description.txt
new file mode 100644
index 0000000..dc72612
--- /dev/null
+++ b/armor_bronze/description.txt
@@ -0,0 +1 @@
+Adds craftable bronze armor.
\ No newline at end of file
diff --git a/armor_bronze/init.lua b/armor_bronze/init.lua
new file mode 100644
index 0000000..d23dffb
--- /dev/null
+++ b/armor_bronze/init.lua
@@ -0,0 +1,181 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Bronze
+--
+--  Requires setting `armor_material_bronze`.
+--
+--  @section bronze
+
+if armor.materials.bronze then
+	--- Bronze Helmet
+	--
+	--  @helmet 3d_armor:helmet_bronze
+	--  @img 3d_armor_inv_helmet_bronze.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 400
+	--  @grp physics_speed -0.01
+	--  @grp physics_gravity 0.01
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:helmet_bronze", {
+		description = S("Bronze Helmet"),
+		inventory_image = "3d_armor_inv_helmet_bronze.png",
+		groups = {armor_head=1, armor_heal=6, armor_use=400,
+			physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+	--- Bronze Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_bronze
+	--  @img 3d_armor_inv_chestplate_bronze.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 400
+	--  @grp physics_speed -0.04
+	--  @grp physics_gravity 0.04
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:chestplate_bronze", {
+		description = S("Bronze Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_bronze.png",
+		groups = {armor_torso=1, armor_heal=6, armor_use=400,
+			physics_speed=-0.04, physics_gravity=0.04},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+	--- Bronze Leggings
+	--
+	--  @leggings 3d_armor:leggings_bronze
+	--  @img 3d_armor_inv_leggings_bronze.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 400
+	--  @grp physics_speed -0.03
+	--  @grp physics_gravity 0.03
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:leggings_bronze", {
+		description = S("Bronze Leggings"),
+		inventory_image = "3d_armor_inv_leggings_bronze.png",
+		groups = {armor_legs=1, armor_heal=6, armor_use=400,
+			physics_speed=-0.03, physics_gravity=0.03},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+	--- Bronze Boots
+	--
+	--  @boots 3d_armor:boots_bronze
+	--  @img 3d_armor_inv_boots_bronze.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 400
+	--  @grp physics_speed -0.01
+	--  @grp physics_gravity 0.01
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:boots_bronze", {
+		description = S("Bronze Boots"),
+		inventory_image = "3d_armor_inv_boots_bronze.png",
+		groups = {armor_feet=1, armor_heal=6, armor_use=400,
+			physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
+	})
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "bronze"
+	local m = armor.materials.bronze
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.de.tr b/armor_bronze/locale/armor_bronze.de.tr
new file mode 100644
index 0000000..dd8a028
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Bronzestiefel
+Bronze Chestplate=Bronzebrustplatte
+Bronze Helmet=Bronzehelm
+Bronze Leggings=Bronzehose
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.eo.tr b/armor_bronze/locale/armor_bronze.eo.tr
new file mode 100644
index 0000000..eab30fc
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_bronze
+
+Bronze Helmet=Bronza Kasko
+Bronze Chestplate=Bronza Brustkiraso
+Bronze Leggings=Bronza Pantalono
+Bronze Boots=Bronza Botoj
diff --git a/armor_bronze/locale/armor_bronze.es.tr b/armor_bronze/locale/armor_bronze.es.tr
new file mode 100644
index 0000000..8a77ce8
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Botas de bronce
+Bronze Chestplate=Peto de bronce
+Bronze Helmet=Casco de bronce
+Bronze Leggings=Grebas de bronce
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.fr.tr b/armor_bronze/locale/armor_bronze.fr.tr
new file mode 100644
index 0000000..8b9de5e
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Bottes en bronze
+Bronze Chestplate=Cuirasse en bronze
+Bronze Helmet=Casque en bronze
+Bronze Leggings=Jambières en bronze
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.it.tr b/armor_bronze/locale/armor_bronze.it.tr
new file mode 100644
index 0000000..57f31b6
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Stivali di bronzo
+Bronze Chestplate=Corazza di bronzo
+Bronze Helmet=Elmo di bronzo
+Bronze Leggings=Gambali di bronzo
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.ms.tr b/armor_bronze/locale/armor_bronze.ms.tr
new file mode 100644
index 0000000..70522e7
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=But Gangsa
+Bronze Chestplate=Perisai Dada Gangsa
+Bronze Helmet=Helmet Gangsa
+Bronze Leggings=Perisai Kaki Gangsa
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.pt.tr b/armor_bronze/locale/armor_bronze.pt.tr
new file mode 100644
index 0000000..cbfea9e
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Botas de Bronze
+Bronze Chestplate=Peitoral de Bronze
+Bronze Helmet=Capacete de Bronze
+Bronze Leggings=Calças de Bronze
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.pt_BR.tr b/armor_bronze/locale/armor_bronze.pt_BR.tr
new file mode 100644
index 0000000..cbfea9e
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=Botas de Bronze
+Bronze Chestplate=Peitoral de Bronze
+Bronze Helmet=Capacete de Bronze
+Bronze Leggings=Calças de Bronze
\ No newline at end of file
diff --git a/armor_bronze/locale/armor_bronze.ru.tr b/armor_bronze/locale/armor_bronze.ru.tr
new file mode 100644
index 0000000..b17beae
--- /dev/null
+++ b/armor_bronze/locale/armor_bronze.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=бронзовые ботинки
+Bronze Chestplate=бронзовый бронежилет
+Bronze Helmet=бронзовый шлем
+Bronze Leggings=бронзовые гамаши
\ No newline at end of file
diff --git a/armor_bronze/locale/template.txt b/armor_bronze/locale/template.txt
new file mode 100644
index 0000000..340d313
--- /dev/null
+++ b/armor_bronze/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_bronze
+
+
+### init.lua ###
+
+Bronze Boots=
+Bronze Chestplate=
+Bronze Helmet=
+Bronze Leggings=
\ No newline at end of file
diff --git a/armor_bronze/mod.conf b/armor_bronze/mod.conf
new file mode 100644
index 0000000..7eec902
--- /dev/null
+++ b/armor_bronze/mod.conf
@@ -0,0 +1,3 @@
+name = armor_bronze
+depends = 3d_armor
+description = Adds craftable bronze armor.
diff --git a/3d_armor/textures/3d_armor_boots_bronze.png b/armor_bronze/textures/3d_armor_boots_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_bronze.png
rename to armor_bronze/textures/3d_armor_boots_bronze.png
diff --git a/3d_armor/textures/3d_armor_boots_bronze_preview.png b/armor_bronze/textures/3d_armor_boots_bronze_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_bronze_preview.png
rename to armor_bronze/textures/3d_armor_boots_bronze_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_bronze.png b/armor_bronze/textures/3d_armor_chestplate_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_bronze.png
rename to armor_bronze/textures/3d_armor_chestplate_bronze.png
diff --git a/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/armor_bronze/textures/3d_armor_chestplate_bronze_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_bronze_preview.png
rename to armor_bronze/textures/3d_armor_chestplate_bronze_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_bronze.png b/armor_bronze/textures/3d_armor_helmet_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_bronze.png
rename to armor_bronze/textures/3d_armor_helmet_bronze.png
diff --git a/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/armor_bronze/textures/3d_armor_helmet_bronze_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_bronze_preview.png
rename to armor_bronze/textures/3d_armor_helmet_bronze_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_bronze.png b/armor_bronze/textures/3d_armor_inv_boots_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_bronze.png
rename to armor_bronze/textures/3d_armor_inv_boots_bronze.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_bronze.png b/armor_bronze/textures/3d_armor_inv_chestplate_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_bronze.png
rename to armor_bronze/textures/3d_armor_inv_chestplate_bronze.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_bronze.png b/armor_bronze/textures/3d_armor_inv_helmet_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_bronze.png
rename to armor_bronze/textures/3d_armor_inv_helmet_bronze.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_bronze.png b/armor_bronze/textures/3d_armor_inv_leggings_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_bronze.png
rename to armor_bronze/textures/3d_armor_inv_leggings_bronze.png
diff --git a/3d_armor/textures/3d_armor_leggings_bronze.png b/armor_bronze/textures/3d_armor_leggings_bronze.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_bronze.png
rename to armor_bronze/textures/3d_armor_leggings_bronze.png
diff --git a/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/armor_bronze/textures/3d_armor_leggings_bronze_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_bronze_preview.png
rename to armor_bronze/textures/3d_armor_leggings_bronze_preview.png
diff --git a/armor_cactus/LICENSE.txt b/armor_cactus/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_cactus/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_cactus/depends.txt b/armor_cactus/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_cactus/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_cactus/description.txt b/armor_cactus/description.txt
new file mode 100644
index 0000000..0f4d63b
--- /dev/null
+++ b/armor_cactus/description.txt
@@ -0,0 +1 @@
+Adds craftable cactus armor.
\ No newline at end of file
diff --git a/armor_cactus/init.lua b/armor_cactus/init.lua
new file mode 100644
index 0000000..9944139
--- /dev/null
+++ b/armor_cactus/init.lua
@@ -0,0 +1,183 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Cactus
+--
+--  Requires setting `armor_material_cactus`.
+--
+--  @section cactus
+
+if armor.materials.cactus then
+	--- Cactus Helmet
+	--
+	--  @helmet 3d_armor:helmet_cactus
+	--  @img 3d_armor_inv_helmet_cactus.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:helmet_cactus", {
+		description = S("Cactus Helmet"),
+		inventory_image = "3d_armor_inv_helmet_cactus.png",
+		groups = {armor_head=1, armor_heal=0, armor_use=1000},
+		armor_groups = {fleshy=5},
+		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
+	})
+	--- Cactus Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_cactus
+	--  @img 3d_armor_inv_chestplate_cactus.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:chestplate_cactus", {
+		description = S("Cactus Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_cactus.png",
+		groups = {armor_torso=1, armor_heal=0, armor_use=1000},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
+	})
+	--- Cactus Leggings
+	--
+	--  @leggings 3d_armor:leggings_cactus
+	--  @img 3d_armor_inv_leggings_cactus.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:leggings_cactus", {
+		description = S("Cactus Leggings"),
+		inventory_image = "3d_armor_inv_leggings_cactus.png",
+		groups = {armor_legs=1, armor_heal=0, armor_use=1000},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
+	})
+	--- Cactus Boots
+	--
+	--  @boots 3d_armor:boots_cactus
+	--  @img 3d_armor_inv_boots_cactus.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:boots_cactus", {
+		description = S("Cactus Boots"),
+		inventory_image = "3d_armor_inv_boots_cactus.png",
+		groups = {armor_feet=1, armor_heal=0, armor_use=1000},
+		armor_groups = {fleshy=5},
+		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
+	})
+	local cactus_armor_fuel = {
+		helmet = 14,
+		chestplate = 16,
+		leggings = 15,
+		boots = 13
+	}
+	for armor, burn in pairs(cactus_armor_fuel) do
+		minetest.register_craft({
+			type = "fuel",
+			recipe = "3d_armor:" .. armor .. "_cactus",
+			burntime = burn,
+		})
+	end
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "cactus"
+	local m = armor.materials.cactus
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.de.tr b/armor_cactus/locale/armor_cactus.de.tr
new file mode 100644
index 0000000..a445240
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Kaktusstiefel
+Cactus Chestplate=Kaktusbrustplatte
+Cactus Helmet=Kaktushelm
+Cactus Leggings=Kaktushose
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.eo.tr b/armor_cactus/locale/armor_cactus.eo.tr
new file mode 100644
index 0000000..f757625
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_cactus
+
+Cactus Helmet=Kakta Kasko
+Cactus Chestplate=Kakta Brustkiraso
+Cactus Leggings=Kakta Pantalono
+Cactus Boots=Kakta Botoj
diff --git a/armor_cactus/locale/armor_cactus.es.tr b/armor_cactus/locale/armor_cactus.es.tr
new file mode 100644
index 0000000..6047856
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Botas de cactus
+Cactus Chestplate=Peto de cactus
+Cactus Helmet=Casco de cactus
+Cactus Leggings=Grebas de cactus
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.fr.tr b/armor_cactus/locale/armor_cactus.fr.tr
new file mode 100644
index 0000000..1698878
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Bottes en cactus
+Cactus Chestplate=Cuirasse en cactus
+Cactus Helmet=Casque en cactus
+Cactus Leggings=Jambières en cactus
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.it.tr b/armor_cactus/locale/armor_cactus.it.tr
new file mode 100644
index 0000000..ecf7ed1
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Stivali di cactus
+Cactus Chestplate=Corazza di cactus
+Cactus Helmet=Elmo di cactus
+Cactus Leggings=Gambali di cactus
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.ms.tr b/armor_cactus/locale/armor_cactus.ms.tr
new file mode 100644
index 0000000..ce6eac8
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=But Kaktus
+Cactus Chestplate=Perisai Dada Kaktus
+Cactus Helmet=Helmet Kaktus
+Cactus Leggings=Perisai Kaki Kaktus
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.pt.tr b/armor_cactus/locale/armor_cactus.pt.tr
new file mode 100644
index 0000000..80d3fac
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Botas de Madeira
+Cactus Chestplate=Peitoral de Cacto
+Cactus Helmet=Capacete de Cacto
+Cactus Leggings=Calças de Cacto
\ No newline at end of file
diff --git a/armor_cactus/locale/armor_cactus.pt_BR.tr b/armor_cactus/locale/armor_cactus.pt_BR.tr
new file mode 100644
index 0000000..46c32e9
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=Botas de Cacto
+Cactus Chestplate=Peitoral de Cacto
+Cactus Helmet=Capacete de Cacto
+Cactus Leggings=Calças de Cacto
diff --git a/armor_cactus/locale/armor_cactus.ru.tr b/armor_cactus/locale/armor_cactus.ru.tr
new file mode 100644
index 0000000..094ce8a
--- /dev/null
+++ b/armor_cactus/locale/armor_cactus.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=кактусовые ботинки
+Cactus Chestplate=кактусовый бронежилет
+Cactus Helmet=кактусовый шлем
+Cactus Leggings=кактусовые гамаши
\ No newline at end of file
diff --git a/armor_cactus/locale/template.txt b/armor_cactus/locale/template.txt
new file mode 100644
index 0000000..4e0cb68
--- /dev/null
+++ b/armor_cactus/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_cactus
+
+
+### init.lua ###
+
+Cactus Boots=
+Cactus Chestplate=
+Cactus Helmet=
+Cactus Leggings=
\ No newline at end of file
diff --git a/armor_cactus/mod.conf b/armor_cactus/mod.conf
new file mode 100644
index 0000000..fc94af2
--- /dev/null
+++ b/armor_cactus/mod.conf
@@ -0,0 +1,3 @@
+name = armor_cactus
+depends = 3d_armor
+description = Adds craftable cactus armor.
diff --git a/3d_armor/textures/3d_armor_boots_cactus.png b/armor_cactus/textures/3d_armor_boots_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_cactus.png
rename to armor_cactus/textures/3d_armor_boots_cactus.png
diff --git a/3d_armor/textures/3d_armor_boots_cactus_preview.png b/armor_cactus/textures/3d_armor_boots_cactus_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_cactus_preview.png
rename to armor_cactus/textures/3d_armor_boots_cactus_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_cactus.png b/armor_cactus/textures/3d_armor_chestplate_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_cactus.png
rename to armor_cactus/textures/3d_armor_chestplate_cactus.png
diff --git a/3d_armor/textures/3d_armor_chestplate_cactus_preview.png b/armor_cactus/textures/3d_armor_chestplate_cactus_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_cactus_preview.png
rename to armor_cactus/textures/3d_armor_chestplate_cactus_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_cactus.png b/armor_cactus/textures/3d_armor_helmet_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_cactus.png
rename to armor_cactus/textures/3d_armor_helmet_cactus.png
diff --git a/3d_armor/textures/3d_armor_helmet_cactus_preview.png b/armor_cactus/textures/3d_armor_helmet_cactus_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_cactus_preview.png
rename to armor_cactus/textures/3d_armor_helmet_cactus_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_cactus.png b/armor_cactus/textures/3d_armor_inv_boots_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_cactus.png
rename to armor_cactus/textures/3d_armor_inv_boots_cactus.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_cactus.png b/armor_cactus/textures/3d_armor_inv_chestplate_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_cactus.png
rename to armor_cactus/textures/3d_armor_inv_chestplate_cactus.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_cactus.png b/armor_cactus/textures/3d_armor_inv_helmet_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_cactus.png
rename to armor_cactus/textures/3d_armor_inv_helmet_cactus.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_cactus.png b/armor_cactus/textures/3d_armor_inv_leggings_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_cactus.png
rename to armor_cactus/textures/3d_armor_inv_leggings_cactus.png
diff --git a/3d_armor/textures/3d_armor_leggings_cactus.png b/armor_cactus/textures/3d_armor_leggings_cactus.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_cactus.png
rename to armor_cactus/textures/3d_armor_leggings_cactus.png
diff --git a/3d_armor/textures/3d_armor_leggings_cactus_preview.png b/armor_cactus/textures/3d_armor_leggings_cactus_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_cactus_preview.png
rename to armor_cactus/textures/3d_armor_leggings_cactus_preview.png
diff --git a/armor_crystal/LICENSE.txt b/armor_crystal/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_crystal/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_crystal/depends.txt b/armor_crystal/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_crystal/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_crystal/description.txt b/armor_crystal/description.txt
new file mode 100644
index 0000000..c4839b1
--- /dev/null
+++ b/armor_crystal/description.txt
@@ -0,0 +1 @@
+Adds craftable crystal armor.
\ No newline at end of file
diff --git a/armor_crystal/init.lua b/armor_crystal/init.lua
new file mode 100644
index 0000000..d845fc2
--- /dev/null
+++ b/armor_crystal/init.lua
@@ -0,0 +1,170 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+
+--- Crystal
+--
+--  Requires `armor_material_crystal`.
+--
+--  @section crystal
+
+if armor.materials.crystal then
+	--- Crystal Helmet
+	--
+	--  @helmet 3d_armor:helmet_crystal
+	--  @img 3d_armor_inv_helmet_crystal.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:helmet_crystal", {
+		description = S("Crystal Helmet"),
+		inventory_image = "3d_armor_inv_helmet_crystal.png",
+		groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Crystal Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_crystal
+	--  @img 3d_armor_inv_chestplate_crystal.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:chestplate_crystal", {
+		description = S("Crystal Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_crystal.png",
+		groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Crystal Leggings
+	--
+	--  @leggings 3d_armor:leggings_crystal
+	--  @img 3d_armor_inv_leggings_crystal.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:leggings_crystal", {
+		description = S("Crystal Leggings"),
+		inventory_image = "3d_armor_inv_leggings_crystal.png",
+		groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Crystal Boots
+	--
+	--  @boots 3d_armor:boots_crystal
+	--  @img 3d_armor_inv_boots_crystal.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @grp physics_speed 1
+	--  @grp physics_jump 0.5
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:boots_crystal", {
+		description = S("Crystal Boots"),
+		inventory_image = "3d_armor_inv_boots_crystal.png",
+		groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1,
+				physics_jump=0.5, armor_fire=1},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "crystal"
+	local m = armor.materials.crystal
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.de.tr b/armor_crystal/locale/armor_crystal.de.tr
new file mode 100644
index 0000000..79a6454
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Kristallstiefel
+Crystal Chestplate=Kristallbrustplatte
+Crystal Helmet=Kristallhelm
+Crystal Leggings=Kristallhose
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.eo.tr b/armor_crystal/locale/armor_crystal.eo.tr
new file mode 100644
index 0000000..9977c5f
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_crystal
+
+Crystal Helmet=Kristala Kasko
+Crystal Chestplate=Kristala Brustkiraso
+Crystal Leggings=Kristala Pantalono
+Crystal Boots=Kristala Botoj
diff --git a/armor_crystal/locale/armor_crystal.es.tr b/armor_crystal/locale/armor_crystal.es.tr
new file mode 100644
index 0000000..b1bb6e4
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Botas de cristal
+Crystal Chestplate=Peto de cristal
+Crystal Helmet=Casco de cristal
+Crystal Leggings=Grebas de cristal
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.fr.tr b/armor_crystal/locale/armor_crystal.fr.tr
new file mode 100644
index 0000000..346f250
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Bottes en cristal
+Crystal Chestplate=Cuirasse en cristal
+Crystal Helmet=Casque en cristal
+Crystal Leggings=Jambières en cristal
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.it.tr b/armor_crystal/locale/armor_crystal.it.tr
new file mode 100644
index 0000000..0d5ef1e
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Stivali di cristallo
+Crystal Chestplate=Corazza di cristallo
+Crystal Helmet=Elmo di cristallo
+Crystal Leggings=Gambali di cristallo
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.ms.tr b/armor_crystal/locale/armor_crystal.ms.tr
new file mode 100644
index 0000000..3e6ad79
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=But Kristal
+Crystal Chestplate=Perisai Dada Kristal
+Crystal Helmet=Helmet Kristal
+Crystal Leggings=Perisai Kaki Kristal
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.pt.tr b/armor_crystal/locale/armor_crystal.pt.tr
new file mode 100644
index 0000000..048ae93
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Botas de Cristal
+Crystal Chestplate=Peitoral de Cristal
+Crystal Helmet=Capacete de Cristal
+Crystal Leggings=Calças de Cristal
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.pt_BR.tr b/armor_crystal/locale/armor_crystal.pt_BR.tr
new file mode 100644
index 0000000..048ae93
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=Botas de Cristal
+Crystal Chestplate=Peitoral de Cristal
+Crystal Helmet=Capacete de Cristal
+Crystal Leggings=Calças de Cristal
\ No newline at end of file
diff --git a/armor_crystal/locale/armor_crystal.ru.tr b/armor_crystal/locale/armor_crystal.ru.tr
new file mode 100644
index 0000000..2e9cd1c
--- /dev/null
+++ b/armor_crystal/locale/armor_crystal.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=кристалловые ботинки
+Crystal Chestplate=кристалловый бронежилет
+Crystal Helmet=кристалловый шлем
+Crystal Leggings=кристалловые гамаши
\ No newline at end of file
diff --git a/armor_crystal/locale/template.txt b/armor_crystal/locale/template.txt
new file mode 100644
index 0000000..ad29782
--- /dev/null
+++ b/armor_crystal/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_crystal
+
+
+### init.lua ###
+
+Crystal Boots=
+Crystal Chestplate=
+Crystal Helmet=
+Crystal Leggings=
\ No newline at end of file
diff --git a/armor_crystal/mod.conf b/armor_crystal/mod.conf
new file mode 100644
index 0000000..3e3ae5e
--- /dev/null
+++ b/armor_crystal/mod.conf
@@ -0,0 +1,4 @@
+name = armor_crystal
+depends = 3d_armor
+optional_depends = etherial
+description = Adds craftable crystal armor.
diff --git a/3d_armor/textures/3d_armor_boots_crystal.png b/armor_crystal/textures/3d_armor_boots_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_crystal.png
rename to armor_crystal/textures/3d_armor_boots_crystal.png
diff --git a/3d_armor/textures/3d_armor_boots_crystal_preview.png b/armor_crystal/textures/3d_armor_boots_crystal_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_crystal_preview.png
rename to armor_crystal/textures/3d_armor_boots_crystal_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_crystal.png b/armor_crystal/textures/3d_armor_chestplate_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_crystal.png
rename to armor_crystal/textures/3d_armor_chestplate_crystal.png
diff --git a/3d_armor/textures/3d_armor_chestplate_crystal_preview.png b/armor_crystal/textures/3d_armor_chestplate_crystal_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_crystal_preview.png
rename to armor_crystal/textures/3d_armor_chestplate_crystal_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_crystal.png b/armor_crystal/textures/3d_armor_helmet_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_crystal.png
rename to armor_crystal/textures/3d_armor_helmet_crystal.png
diff --git a/3d_armor/textures/3d_armor_helmet_crystal_preview.png b/armor_crystal/textures/3d_armor_helmet_crystal_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_crystal_preview.png
rename to armor_crystal/textures/3d_armor_helmet_crystal_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_crystal.png b/armor_crystal/textures/3d_armor_inv_boots_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_crystal.png
rename to armor_crystal/textures/3d_armor_inv_boots_crystal.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_crystal.png b/armor_crystal/textures/3d_armor_inv_chestplate_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_crystal.png
rename to armor_crystal/textures/3d_armor_inv_chestplate_crystal.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_crystal.png b/armor_crystal/textures/3d_armor_inv_helmet_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_crystal.png
rename to armor_crystal/textures/3d_armor_inv_helmet_crystal.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_crystal.png b/armor_crystal/textures/3d_armor_inv_leggings_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_crystal.png
rename to armor_crystal/textures/3d_armor_inv_leggings_crystal.png
diff --git a/3d_armor/textures/3d_armor_leggings_crystal.png b/armor_crystal/textures/3d_armor_leggings_crystal.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_crystal.png
rename to armor_crystal/textures/3d_armor_leggings_crystal.png
diff --git a/3d_armor/textures/3d_armor_leggings_crystal_preview.png b/armor_crystal/textures/3d_armor_leggings_crystal_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_crystal_preview.png
rename to armor_crystal/textures/3d_armor_leggings_crystal_preview.png
diff --git a/armor_diamond/LICENSE.txt b/armor_diamond/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_diamond/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_diamond/depends.txt b/armor_diamond/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_diamond/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_diamond/description.txt b/armor_diamond/description.txt
new file mode 100644
index 0000000..5934a25
--- /dev/null
+++ b/armor_diamond/description.txt
@@ -0,0 +1 @@
+Adds craftable diamond armor.
\ No newline at end of file
diff --git a/armor_diamond/init.lua b/armor_diamond/init.lua
new file mode 100644
index 0000000..8fc2d0c
--- /dev/null
+++ b/armor_diamond/init.lua
@@ -0,0 +1,166 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Diamond
+--
+--  Requires setting `armor_material_diamond`.
+--
+--  @section diamond
+
+if armor.materials.diamond then
+	--- Diamond Helmet
+	--
+	--  @helmet 3d_armor:helmet_diamond
+	--  @img 3d_armor_inv_helmet_diamond.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 200
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp choppy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:helmet_diamond", {
+		description = S("Diamond Helmet"),
+		inventory_image = "3d_armor_inv_helmet_diamond.png",
+		groups = {armor_head=1, armor_heal=12, armor_use=200},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+	--- Diamond Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_diamond
+	--  @img 3d_armor_inv_chestplate_diamond.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 200
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp choppy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:chestplate_diamond", {
+		description = S("Diamond Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_diamond.png",
+		groups = {armor_torso=1, armor_heal=12, armor_use=200},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+	--- Diamond Leggings
+	--
+	--  @leggings 3d_armor:leggings_diamond
+	--  @img 3d_armor_inv_leggings_diamond.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 200
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp choppy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:leggings_diamond", {
+		description = S("Diamond Leggings"),
+		inventory_image = "3d_armor_inv_leggings_diamond.png",
+		groups = {armor_legs=1, armor_heal=12, armor_use=200},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+	--- Diamond Boots
+	--
+	--  @boots 3d_armor:boots_diamond
+	--  @img 3d_armor_inv_boots_diamond.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 200
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp choppy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:boots_diamond", {
+		description = S("Diamond Boots"),
+		inventory_image = "3d_armor_inv_boots_diamond.png",
+		groups = {armor_feet=1, armor_heal=12, armor_use=200},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
+	})
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "diamond"
+	local m = armor.materials.diamond
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.de.tr b/armor_diamond/locale/armor_diamond.de.tr
new file mode 100644
index 0000000..dc6c3d4
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Diamantstiefel
+Diamond Chestplate=Diamantbrustplatte
+Diamond Helmet=Diamanthelm
+Diamond Leggings=Diamanthose
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.eo.tr b/armor_diamond/locale/armor_diamond.eo.tr
new file mode 100644
index 0000000..6a781f1
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_diamond
+
+Diamond Helmet=Diamanta Kasko
+Diamond Chestplate=Diamanta Brustkiraso
+Diamond Leggings=Diamanta Pantalono
+Diamond Boots=Diamanta Botoj
diff --git a/armor_diamond/locale/armor_diamond.es.tr b/armor_diamond/locale/armor_diamond.es.tr
new file mode 100644
index 0000000..9b352f7
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Botas de diamante
+Diamond Chestplate=Peto de diamante
+Diamond Helmet=Casco de diamante
+Diamond Leggings=Grebas de diamante
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.fr.tr b/armor_diamond/locale/armor_diamond.fr.tr
new file mode 100644
index 0000000..11171ed
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Bottes en diamant
+Diamond Chestplate=Cuirasse en diamant
+Diamond Helmet=Casque en diamant
+Diamond Leggings=Jambières en diamant
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.it.tr b/armor_diamond/locale/armor_diamond.it.tr
new file mode 100644
index 0000000..29361c8
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Stivali di diamante
+Diamond Chestplate=Corazza di diamante
+Diamond Helmet=Elmo di diamante
+Diamond Leggings=Gambali di diamante
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.ms.tr b/armor_diamond/locale/armor_diamond.ms.tr
new file mode 100644
index 0000000..bb99db9
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=But Intan
+Diamond Chestplate=Perisai Dada Intan
+Diamond Helmet=Helmet Intan
+Diamond Leggings=Perisai Kaki Intan
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.pt.tr b/armor_diamond/locale/armor_diamond.pt.tr
new file mode 100644
index 0000000..5951b47
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Botas de Diamante
+Diamond Chestplate=Peitoral de Diamante
+Diamond Helmet=Capacete de Diamante
+Diamond Leggings=Calças de Diamante
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.pt_BR.tr b/armor_diamond/locale/armor_diamond.pt_BR.tr
new file mode 100644
index 0000000..5951b47
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=Botas de Diamante
+Diamond Chestplate=Peitoral de Diamante
+Diamond Helmet=Capacete de Diamante
+Diamond Leggings=Calças de Diamante
\ No newline at end of file
diff --git a/armor_diamond/locale/armor_diamond.ru.tr b/armor_diamond/locale/armor_diamond.ru.tr
new file mode 100644
index 0000000..1248e34
--- /dev/null
+++ b/armor_diamond/locale/armor_diamond.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=алмазные ботинки
+Diamond Chestplate=алмазный бронежилет
+Diamond Helmet=алмазный шлем
+Diamond Leggings=алмазные гамаши
\ No newline at end of file
diff --git a/armor_diamond/locale/template.txt b/armor_diamond/locale/template.txt
new file mode 100644
index 0000000..1bccc60
--- /dev/null
+++ b/armor_diamond/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_diamond
+
+
+### init.lua ###
+
+Diamond Boots=
+Diamond Chestplate=
+Diamond Helmet=
+Diamond Leggings=
\ No newline at end of file
diff --git a/armor_diamond/mod.conf b/armor_diamond/mod.conf
new file mode 100644
index 0000000..27d1cc9
--- /dev/null
+++ b/armor_diamond/mod.conf
@@ -0,0 +1,3 @@
+name = armor_diamond
+depends = 3d_armor
+description = Adds craftable diamond armor.
diff --git a/3d_armor/textures/3d_armor_boots_diamond.png b/armor_diamond/textures/3d_armor_boots_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_diamond.png
rename to armor_diamond/textures/3d_armor_boots_diamond.png
diff --git a/3d_armor/textures/3d_armor_boots_diamond_preview.png b/armor_diamond/textures/3d_armor_boots_diamond_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_diamond_preview.png
rename to armor_diamond/textures/3d_armor_boots_diamond_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_diamond.png b/armor_diamond/textures/3d_armor_chestplate_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_diamond.png
rename to armor_diamond/textures/3d_armor_chestplate_diamond.png
diff --git a/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/armor_diamond/textures/3d_armor_chestplate_diamond_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_diamond_preview.png
rename to armor_diamond/textures/3d_armor_chestplate_diamond_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_diamond.png b/armor_diamond/textures/3d_armor_helmet_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_diamond.png
rename to armor_diamond/textures/3d_armor_helmet_diamond.png
diff --git a/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/armor_diamond/textures/3d_armor_helmet_diamond_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_diamond_preview.png
rename to armor_diamond/textures/3d_armor_helmet_diamond_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_diamond.png b/armor_diamond/textures/3d_armor_inv_boots_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_diamond.png
rename to armor_diamond/textures/3d_armor_inv_boots_diamond.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/armor_diamond/textures/3d_armor_inv_chestplate_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_diamond.png
rename to armor_diamond/textures/3d_armor_inv_chestplate_diamond.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/armor_diamond/textures/3d_armor_inv_helmet_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_diamond.png
rename to armor_diamond/textures/3d_armor_inv_helmet_diamond.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/armor_diamond/textures/3d_armor_inv_leggings_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_diamond.png
rename to armor_diamond/textures/3d_armor_inv_leggings_diamond.png
diff --git a/3d_armor/textures/3d_armor_leggings_diamond.png b/armor_diamond/textures/3d_armor_leggings_diamond.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_diamond.png
rename to armor_diamond/textures/3d_armor_leggings_diamond.png
diff --git a/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/armor_diamond/textures/3d_armor_leggings_diamond_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_diamond_preview.png
rename to armor_diamond/textures/3d_armor_leggings_diamond_preview.png
diff --git a/armor_gold/LICENSE.txt b/armor_gold/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_gold/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_gold/depends.txt b/armor_gold/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_gold/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_gold/description.txt b/armor_gold/description.txt
new file mode 100644
index 0000000..1d539f9
--- /dev/null
+++ b/armor_gold/description.txt
@@ -0,0 +1 @@
+Adds craftable gold armor.
\ No newline at end of file
diff --git a/armor_gold/init.lua b/armor_gold/init.lua
new file mode 100644
index 0000000..287f307
--- /dev/null
+++ b/armor_gold/init.lua
@@ -0,0 +1,183 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+
+--- Gold
+--
+--  Requires `armor_material_gold`.
+--
+--  @section gold
+
+if armor.materials.gold then
+	--- Gold Helmet
+	--
+	--  @helmet 3d_armor:helmet_gold
+	--  @img 3d_armor_inv_helmet_gold.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 300
+	--  @grp physics_speed -0.02
+	--  @grp physics_gravity 0.02
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 1
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 3
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:helmet_gold", {
+		description = S("Gold Helmet"),
+		inventory_image = "3d_armor_inv_helmet_gold.png",
+		groups = {armor_head=1, armor_heal=6, armor_use=300,
+			physics_speed=-0.02, physics_gravity=0.02},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
+	})
+	--- Gold Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_gold
+	--  @img 3d_armor_inv_chestplate_gold.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 300
+	--  @grp physics_speed -0.05
+	--  @grp physics_gravity 0.05
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 1
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 3
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:chestplate_gold", {
+		description = S("Gold Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_gold.png",
+		groups = {armor_torso=1, armor_heal=6, armor_use=300,
+			physics_speed=-0.05, physics_gravity=0.05},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
+	})
+	--- Gold Leggings
+	--
+	--  @leggings 3d_armor:leggings_gold
+	--  @img 3d_armor_inv_leggings_gold.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 300
+	--  @grp physics_speed -0.04
+	--  @grp physics_gravity 0.04
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 1
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 3
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:leggings_gold", {
+		description = S("Gold Leggings"),
+		inventory_image = "3d_armor_inv_leggings_gold.png",
+		groups = {armor_legs=1, armor_heal=6, armor_use=300,
+			physics_speed=-0.04, physics_gravity=0.04},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
+	})
+	--- Gold Boots
+	--
+	--  @boots 3d_armor:boots_gold
+	--  @img 3d_armor_inv_boots_gold.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 300
+	--  @grp physics_speed -0.02
+	--  @grp physics_gravity 0.02
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 1
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 3
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:boots_gold", {
+		description = S("Gold Boots"),
+		inventory_image = "3d_armor_inv_boots_gold.png",
+		groups = {armor_feet=1, armor_heal=6, armor_use=300,
+			physics_speed=-0.02, physics_gravity=0.02},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
+	})
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "gold"
+	local m = armor.materials.gold
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.de.tr b/armor_gold/locale/armor_gold.de.tr
new file mode 100644
index 0000000..b884aef
--- /dev/null
+++ b/armor_gold/locale/armor_gold.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Goldstiefel
+Gold Chestplate=Goldbrustplatte
+Gold Helmet=Goldhelm
+Gold Leggings=Goldhose
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.eo.tr b/armor_gold/locale/armor_gold.eo.tr
new file mode 100644
index 0000000..07525a2
--- /dev/null
+++ b/armor_gold/locale/armor_gold.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_gold
+
+Gold Helmet=Ora Kasko
+Gold Chestplate=Ora Brustkiraso
+Gold Leggings=Ora Pantalono
+Gold Boots=Ora Botoj
diff --git a/armor_gold/locale/armor_gold.es.tr b/armor_gold/locale/armor_gold.es.tr
new file mode 100644
index 0000000..c8c14d9
--- /dev/null
+++ b/armor_gold/locale/armor_gold.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Botas de oro
+Gold Chestplate=Peto de oro
+Gold Helmet=Casco de oro
+Gold Leggings=Grebas de oro
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.fr.tr b/armor_gold/locale/armor_gold.fr.tr
new file mode 100644
index 0000000..54baea6
--- /dev/null
+++ b/armor_gold/locale/armor_gold.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Bottes en or
+Gold Chestplate=Cuirasse en or
+Gold Helmet=Casque en or
+Gold Leggings=Jambières en or
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.it.tr b/armor_gold/locale/armor_gold.it.tr
new file mode 100644
index 0000000..a599f83
--- /dev/null
+++ b/armor_gold/locale/armor_gold.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Stivali d'oro
+Gold Chestplate=Corazza d'oro
+Gold Helmet=Elmo d'oro
+Gold Leggings=Gambali d'oro
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.ms.tr b/armor_gold/locale/armor_gold.ms.tr
new file mode 100644
index 0000000..1d8988b
--- /dev/null
+++ b/armor_gold/locale/armor_gold.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=But Emas
+Gold Chestplate=Perisai Dada Emas
+Gold Helmet=Helmet Emas
+Gold Leggings=Perisai Kaki Emas
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.pt.tr b/armor_gold/locale/armor_gold.pt.tr
new file mode 100644
index 0000000..daa8153
--- /dev/null
+++ b/armor_gold/locale/armor_gold.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Botas de Ouro
+Gold Chestplate=Peitoral de Ouro
+Gold Helmet=Capacete de Ouro
+Gold Leggings=Calças de Ouro
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.pt_BR.tr b/armor_gold/locale/armor_gold.pt_BR.tr
new file mode 100644
index 0000000..daa8153
--- /dev/null
+++ b/armor_gold/locale/armor_gold.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=Botas de Ouro
+Gold Chestplate=Peitoral de Ouro
+Gold Helmet=Capacete de Ouro
+Gold Leggings=Calças de Ouro
\ No newline at end of file
diff --git a/armor_gold/locale/armor_gold.ru.tr b/armor_gold/locale/armor_gold.ru.tr
new file mode 100644
index 0000000..273c321
--- /dev/null
+++ b/armor_gold/locale/armor_gold.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=золотые ботинки
+Gold Chestplate=золотой бронежилет
+Gold Helmet=золотой шлем
+Gold Leggings=золотые гамаши
\ No newline at end of file
diff --git a/armor_gold/locale/template.txt b/armor_gold/locale/template.txt
new file mode 100644
index 0000000..2fce263
--- /dev/null
+++ b/armor_gold/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_gold
+
+
+### init.lua ###
+
+Gold Boots=
+Gold Chestplate=
+Gold Helmet=
+Gold Leggings=
\ No newline at end of file
diff --git a/armor_gold/mod.conf b/armor_gold/mod.conf
new file mode 100644
index 0000000..092ab6d
--- /dev/null
+++ b/armor_gold/mod.conf
@@ -0,0 +1,3 @@
+name = armor_gold
+depends = 3d_armor
+description = Adds craftable gold armor.
diff --git a/3d_armor/textures/3d_armor_boots_gold.png b/armor_gold/textures/3d_armor_boots_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_gold.png
rename to armor_gold/textures/3d_armor_boots_gold.png
diff --git a/3d_armor/textures/3d_armor_boots_gold_preview.png b/armor_gold/textures/3d_armor_boots_gold_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_gold_preview.png
rename to armor_gold/textures/3d_armor_boots_gold_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_gold.png b/armor_gold/textures/3d_armor_chestplate_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_gold.png
rename to armor_gold/textures/3d_armor_chestplate_gold.png
diff --git a/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/armor_gold/textures/3d_armor_chestplate_gold_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_gold_preview.png
rename to armor_gold/textures/3d_armor_chestplate_gold_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_gold.png b/armor_gold/textures/3d_armor_helmet_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_gold.png
rename to armor_gold/textures/3d_armor_helmet_gold.png
diff --git a/3d_armor/textures/3d_armor_helmet_gold_preview.png b/armor_gold/textures/3d_armor_helmet_gold_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_gold_preview.png
rename to armor_gold/textures/3d_armor_helmet_gold_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_gold.png b/armor_gold/textures/3d_armor_inv_boots_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_gold.png
rename to armor_gold/textures/3d_armor_inv_boots_gold.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/armor_gold/textures/3d_armor_inv_chestplate_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_gold.png
rename to armor_gold/textures/3d_armor_inv_chestplate_gold.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_gold.png b/armor_gold/textures/3d_armor_inv_helmet_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_gold.png
rename to armor_gold/textures/3d_armor_inv_helmet_gold.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_gold.png b/armor_gold/textures/3d_armor_inv_leggings_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_gold.png
rename to armor_gold/textures/3d_armor_inv_leggings_gold.png
diff --git a/3d_armor/textures/3d_armor_leggings_gold.png b/armor_gold/textures/3d_armor_leggings_gold.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_gold.png
rename to armor_gold/textures/3d_armor_leggings_gold.png
diff --git a/3d_armor/textures/3d_armor_leggings_gold_preview.png b/armor_gold/textures/3d_armor_leggings_gold_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_gold_preview.png
rename to armor_gold/textures/3d_armor_leggings_gold_preview.png
diff --git a/armor_mithril/LICENSE.txt b/armor_mithril/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_mithril/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_mithril/depends.txt b/armor_mithril/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_mithril/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_mithril/description.txt b/armor_mithril/description.txt
new file mode 100644
index 0000000..e72255b
--- /dev/null
+++ b/armor_mithril/description.txt
@@ -0,0 +1 @@
+Adds craftable mithril armor.
\ No newline at end of file
diff --git a/armor_mithril/init.lua b/armor_mithril/init.lua
new file mode 100644
index 0000000..8e134f1
--- /dev/null
+++ b/armor_mithril/init.lua
@@ -0,0 +1,162 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Mithril
+--
+--  Requires `armor_material_mithril`.
+--
+--  @section mithril
+
+if armor.materials.mithril then
+	--- Mithril Helmet
+	--
+	--  @helmet 3d_armor:helmet_mithril
+	--  @img 3d_armor_inv_helmet_mithril.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:helmet_mithril", {
+		description = S("Mithril Helmet"),
+		inventory_image = "3d_armor_inv_helmet_mithril.png",
+		groups = {armor_head=1, armor_heal=13, armor_use=66},
+		armor_groups = {fleshy=16},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Mithril Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_mithril
+	--  @img 3d_armor_inv_chestplate_mithril.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:chestplate_mithril", {
+		description = S("Mithril Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_mithril.png",
+		groups = {armor_torso=1, armor_heal=13, armor_use=66},
+		armor_groups = {fleshy=21},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Mithril Leggings
+	--
+	--  @leggings 3d_armor:leggings_mithril
+	--  @img 3d_armor_inv_leggings_mithril.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:leggings_mithril", {
+		description = S("Mithril Leggings"),
+		inventory_image = "3d_armor_inv_leggings_mithril.png",
+		groups = {armor_legs=1, armor_heal=13, armor_use=66},
+		armor_groups = {fleshy=21},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+	--- Mithril Boots
+	--
+	--  @boots 3d_armor:boots_mithril
+	--  @img 3d_armor_inv_boots_mithril.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:boots_mithril", {
+		description = S("Mithril Boots"),
+		inventory_image = "3d_armor_inv_boots_mithril.png",
+		groups = {armor_feet=1, armor_heal=13, armor_use=66},
+		armor_groups = {fleshy=16},
+		damage_groups = {cracky=2, snappy=1, level=3},
+	})
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "mithril"
+	local m = armor.materials.mithril
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.de.tr b/armor_mithril/locale/armor_mithril.de.tr
new file mode 100644
index 0000000..268f152
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Mithrilstiefel
+Mithril Chestplate=Mithrilbrustplatte
+Mithril Helmet=Mithrilhelm
+Mithril Leggings=Mithrilhose
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.eo.tr b/armor_mithril/locale/armor_mithril.eo.tr
new file mode 100644
index 0000000..43de867
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_mithril
+
+Mithril Helmet=Mitrila Kasko
+Mithril Chestplate=Mitrila Brustkiraso
+Mithril Leggings=Mitrila Pantalono
+Mithril Boots=Mitrila Botoj
diff --git a/armor_mithril/locale/armor_mithril.es.tr b/armor_mithril/locale/armor_mithril.es.tr
new file mode 100644
index 0000000..52eee57
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Botas de mitrilo
+Mithril Chestplate=Peto de mitrilo
+Mithril Helmet=Casco de mitrilo
+Mithril Leggings=Grebas de mitrilo
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.fr.tr b/armor_mithril/locale/armor_mithril.fr.tr
new file mode 100644
index 0000000..5e2d3ae
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Bottes en mithril
+Mithril Chestplate=Cuirasse en mithril
+Mithril Helmet=Casque en mithril
+Mithril Leggings=Jambières en mithril
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.it.tr b/armor_mithril/locale/armor_mithril.it.tr
new file mode 100644
index 0000000..900a964
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Stivali di mithril
+Mithril Chestplate=Corazza di mithril
+Mithril Helmet=Elmo di mithril
+Mithril Leggings=Gambali di mithril
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.ms.tr b/armor_mithril/locale/armor_mithril.ms.tr
new file mode 100644
index 0000000..6199e4d
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=But Mithril
+Mithril Chestplate=Perisai Dada Mithril
+Mithril Helmet=Helmet Mithril
+Mithril Leggings=Perisai Kaki Mithril
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.pt.tr b/armor_mithril/locale/armor_mithril.pt.tr
new file mode 100644
index 0000000..bcb3298
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Botas de Mithril
+Mithril Chestplate=Peitoral de Mithril
+Mithril Helmet=Capacete de Mithril
+Mithril Leggings=Calças de Mithril
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.pt_BR.tr b/armor_mithril/locale/armor_mithril.pt_BR.tr
new file mode 100644
index 0000000..bcb3298
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=Botas de Mithril
+Mithril Chestplate=Peitoral de Mithril
+Mithril Helmet=Capacete de Mithril
+Mithril Leggings=Calças de Mithril
\ No newline at end of file
diff --git a/armor_mithril/locale/armor_mithril.ru.tr b/armor_mithril/locale/armor_mithril.ru.tr
new file mode 100644
index 0000000..265164f
--- /dev/null
+++ b/armor_mithril/locale/armor_mithril.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_mithril
+
+
+### init.lua ###
+
+Mithril Boots=мифриловые ботинки
+Mithril Chestplate=мифриловый бронежилет
+Mithril Helmet=мифриловый шлем
+Mithril Leggings=мифриловые гамаши
\ No newline at end of file
diff --git a/armor_mithril/locale/template.txt b/armor_mithril/locale/template.txt
new file mode 100644
index 0000000..a1ff832
--- /dev/null
+++ b/armor_mithril/locale/template.txt
@@ -0,0 +1,30 @@
+# textdomain: 3d_armor
+
+
+### api.lua ###
+
+3d_armor: Detached armor inventory is nil @1=
+3d_armor: Player name is nil @1=
+3d_armor: Player reference is nil @1=
+
+### armor.lua ###
+
+Nether Boots=
+Nether Chestplate=
+Nether Helmet=
+Nether Leggings=
+Mithril Boots=
+Mithril Chestplate=
+Mithril Helmet=
+Mithril Leggings=
+
+### init.lua ###
+
+3d_armor: Failed to initialize player=
+Fire=
+Heal=
+Level=
+Radiation=
+Your @1 got destroyed!=
+Your @1 is almost broken!=
+[3d_armor] Fire Nodes disabled=
diff --git a/armor_mithril/mod.conf b/armor_mithril/mod.conf
new file mode 100644
index 0000000..5cc6948
--- /dev/null
+++ b/armor_mithril/mod.conf
@@ -0,0 +1,4 @@
+name = armor_mithril
+depends = 3d_armor
+optional_depends = moreores
+description = Adds craftable mithril armor.
diff --git a/3d_armor/textures/3d_armor_boots_mithril.png b/armor_mithril/textures/3d_armor_boots_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_mithril.png
rename to armor_mithril/textures/3d_armor_boots_mithril.png
diff --git a/3d_armor/textures/3d_armor_boots_mithril_preview.png b/armor_mithril/textures/3d_armor_boots_mithril_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_mithril_preview.png
rename to armor_mithril/textures/3d_armor_boots_mithril_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_mithril.png b/armor_mithril/textures/3d_armor_chestplate_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_mithril.png
rename to armor_mithril/textures/3d_armor_chestplate_mithril.png
diff --git a/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/armor_mithril/textures/3d_armor_chestplate_mithril_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_mithril_preview.png
rename to armor_mithril/textures/3d_armor_chestplate_mithril_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_mithril.png b/armor_mithril/textures/3d_armor_helmet_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_mithril.png
rename to armor_mithril/textures/3d_armor_helmet_mithril.png
diff --git a/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/armor_mithril/textures/3d_armor_helmet_mithril_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_mithril_preview.png
rename to armor_mithril/textures/3d_armor_helmet_mithril_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_mithril.png b/armor_mithril/textures/3d_armor_inv_boots_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_mithril.png
rename to armor_mithril/textures/3d_armor_inv_boots_mithril.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_mithril.png b/armor_mithril/textures/3d_armor_inv_chestplate_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_mithril.png
rename to armor_mithril/textures/3d_armor_inv_chestplate_mithril.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_mithril.png b/armor_mithril/textures/3d_armor_inv_helmet_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_mithril.png
rename to armor_mithril/textures/3d_armor_inv_helmet_mithril.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_mithril.png b/armor_mithril/textures/3d_armor_inv_leggings_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_mithril.png
rename to armor_mithril/textures/3d_armor_inv_leggings_mithril.png
diff --git a/3d_armor/textures/3d_armor_leggings_mithril.png b/armor_mithril/textures/3d_armor_leggings_mithril.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_mithril.png
rename to armor_mithril/textures/3d_armor_leggings_mithril.png
diff --git a/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/armor_mithril/textures/3d_armor_leggings_mithril_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_mithril_preview.png
rename to armor_mithril/textures/3d_armor_leggings_mithril_preview.png
diff --git a/armor_nether/LICENSE.txt b/armor_nether/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_nether/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_nether/depends.txt b/armor_nether/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_nether/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_nether/description.txt b/armor_nether/description.txt
new file mode 100644
index 0000000..482871d
--- /dev/null
+++ b/armor_nether/description.txt
@@ -0,0 +1 @@
+Adds craftable wood armor.
\ No newline at end of file
diff --git a/armor_nether/init.lua b/armor_nether/init.lua
new file mode 100644
index 0000000..f761a21
--- /dev/null
+++ b/armor_nether/init.lua
@@ -0,0 +1,168 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+
+--- Nether
+--
+--  Requires `armor_material_nether`.
+--
+--  @section nether
+
+if armor.materials.nether then
+	--- Nether Helmet
+	--
+	--  @helmet 3d_armor:helmet_nether
+	--  @img 3d_armor_inv_helmet_nether.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 14
+	--  @grp armor_use 200
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 18
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:helmet_nether", {
+		description = S("Nether Helmet"),
+		inventory_image = "3d_armor_inv_helmet_nether.png",
+		groups = {armor_head=1, armor_heal=14, armor_use=100, armor_fire=1},
+		armor_groups = {fleshy=18},
+		damage_groups = {cracky=3, snappy=2, level=3},
+	})
+	--- Nether Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_nether
+	--  @img 3d_armor_inv_chestplate_nether.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 14
+	--  @grp armor_use 200
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 25
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:chestplate_nether", {
+		description = S("Nether Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_nether.png",
+		groups = {armor_torso=1, armor_heal=14, armor_use=200, armor_fire=1},
+		armor_groups = {fleshy=25},
+		damage_groups = {cracky=3, snappy=2, level=3},
+	})
+	--- Nether Leggings
+	--
+	--  @leggings 3d_armor:leggings_nether
+	--  @img 3d_armor_inv_leggings_nether.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 14
+	--  @grp armor_use 200
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 25
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:leggings_nether", {
+		description = S("Nether Leggings"),
+		inventory_image = "3d_armor_inv_leggings_nether.png",
+		groups = {armor_legs=1, armor_heal=14, armor_use=200, armor_fire=1},
+		armor_groups = {fleshy=25},
+		damage_groups = {cracky=3, snappy=2, level=3},
+	})
+	--- Nether Boots
+	--
+	--  @boots 3d_armor:boots_nether
+	--  @img 3d_armor_inv_boots_nether.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 14
+	--  @grp armor_use 200
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 18
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp level 3
+	armor:register_armor(":3d_armor:boots_nether", {
+		description = S("Nether Boots"),
+		inventory_image = "3d_armor_inv_boots_nether.png",
+		groups = {armor_feet=1, armor_heal=14, armor_use=200, armor_fire=1},
+		armor_groups = {fleshy=18},
+		damage_groups = {cracky=3, snappy=2, level=3},
+	})
+
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "nether"
+	local m = armor.materials.nether
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+
+end
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.de.tr b/armor_nether/locale/armor_nether.de.tr
new file mode 100644
index 0000000..0e0aa7c
--- /dev/null
+++ b/armor_nether/locale/armor_nether.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Netherstiefel
+Nether Chestplate=Netherbrustplatte
+Nether Helmet=Netherhelm
+Nether Leggings=Netherhose
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.eo.tr b/armor_nether/locale/armor_nether.eo.tr
new file mode 100644
index 0000000..8d136eb
--- /dev/null
+++ b/armor_nether/locale/armor_nether.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_nether
+
+Nether Helmet=Inferna Kasko
+Nether Chestplate=Inferna Brustkiraso
+Nether Leggings=Inferna Pantalono
+Nether Boots=Inferna Botoj
diff --git a/armor_nether/locale/armor_nether.es.tr b/armor_nether/locale/armor_nether.es.tr
new file mode 100644
index 0000000..8477d78
--- /dev/null
+++ b/armor_nether/locale/armor_nether.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Botas de nether
+Nether Chestplate=Peto de nether
+Nether Helmet=Casco de nether
+Nether Leggings=Grebas de nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.fr.tr b/armor_nether/locale/armor_nether.fr.tr
new file mode 100644
index 0000000..99cbaf0
--- /dev/null
+++ b/armor_nether/locale/armor_nether.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Bottes en nether
+Nether Chestplate=Cuirasse en nether
+Nether Helmet=Casque en nether
+Nether Leggings=Jambières en nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.it.tr b/armor_nether/locale/armor_nether.it.tr
new file mode 100644
index 0000000..69a773c
--- /dev/null
+++ b/armor_nether/locale/armor_nether.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Stivali di nether
+Nether Chestplate=Corazza di nether
+Nether Helmet=Elmo di nether
+Nether Leggings=Gambali di nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.ms.tr b/armor_nether/locale/armor_nether.ms.tr
new file mode 100644
index 0000000..1bb5acd
--- /dev/null
+++ b/armor_nether/locale/armor_nether.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=But Nether
+Nether Chestplate=Perisai Dada Nether
+Nether Helmet=Helmet Nether
+Nether Leggings=Perisai Kaki Nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.pt.tr b/armor_nether/locale/armor_nether.pt.tr
new file mode 100644
index 0000000..9c6e304
--- /dev/null
+++ b/armor_nether/locale/armor_nether.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Botas de Nether
+Nether Chestplate=Peitoral de Nether
+Nether Helmet=Capacete de Nether
+Nether Leggings=Calças de Nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.pt_BR.tr b/armor_nether/locale/armor_nether.pt_BR.tr
new file mode 100644
index 0000000..9c6e304
--- /dev/null
+++ b/armor_nether/locale/armor_nether.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=Botas de Nether
+Nether Chestplate=Peitoral de Nether
+Nether Helmet=Capacete de Nether
+Nether Leggings=Calças de Nether
\ No newline at end of file
diff --git a/armor_nether/locale/armor_nether.ru.tr b/armor_nether/locale/armor_nether.ru.tr
new file mode 100644
index 0000000..934279e
--- /dev/null
+++ b/armor_nether/locale/armor_nether.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=адские ботинки
+Nether Chestplate=адский бронежилет
+Nether Helmet=адский шлем
+Nether Leggings=адские гамаши
\ No newline at end of file
diff --git a/armor_nether/locale/template.txt b/armor_nether/locale/template.txt
new file mode 100644
index 0000000..a3faee8
--- /dev/null
+++ b/armor_nether/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_nether
+
+
+### init.lua ###
+
+Nether Boots=
+Nether Chestplate=
+Nether Helmet=
+Nether Leggings=
\ No newline at end of file
diff --git a/armor_nether/mod.conf b/armor_nether/mod.conf
new file mode 100644
index 0000000..3e99b55
--- /dev/null
+++ b/armor_nether/mod.conf
@@ -0,0 +1,4 @@
+name = armor_nether
+depends = 3d_armor
+optional_depends = nether
+description = Adds craftable wood armor.
diff --git a/armor_nether/textures/3d_armor_boots_nether.png b/armor_nether/textures/3d_armor_boots_nether.png
new file mode 100644
index 0000000..745b765
Binary files /dev/null and b/armor_nether/textures/3d_armor_boots_nether.png differ
diff --git a/armor_nether/textures/3d_armor_boots_nether_preview.png b/armor_nether/textures/3d_armor_boots_nether_preview.png
new file mode 100644
index 0000000..e459d95
Binary files /dev/null and b/armor_nether/textures/3d_armor_boots_nether_preview.png differ
diff --git a/armor_nether/textures/3d_armor_chestplate_nether.png b/armor_nether/textures/3d_armor_chestplate_nether.png
new file mode 100644
index 0000000..c26bf2d
Binary files /dev/null and b/armor_nether/textures/3d_armor_chestplate_nether.png differ
diff --git a/armor_nether/textures/3d_armor_chestplate_nether_preview.png b/armor_nether/textures/3d_armor_chestplate_nether_preview.png
new file mode 100644
index 0000000..818c305
Binary files /dev/null and b/armor_nether/textures/3d_armor_chestplate_nether_preview.png differ
diff --git a/armor_nether/textures/3d_armor_helmet_nether.png b/armor_nether/textures/3d_armor_helmet_nether.png
new file mode 100644
index 0000000..202a8d5
Binary files /dev/null and b/armor_nether/textures/3d_armor_helmet_nether.png differ
diff --git a/armor_nether/textures/3d_armor_helmet_nether_preview.png b/armor_nether/textures/3d_armor_helmet_nether_preview.png
new file mode 100644
index 0000000..0f2c0e1
Binary files /dev/null and b/armor_nether/textures/3d_armor_helmet_nether_preview.png differ
diff --git a/armor_nether/textures/3d_armor_inv_boots_nether.png b/armor_nether/textures/3d_armor_inv_boots_nether.png
new file mode 100644
index 0000000..97e4781
Binary files /dev/null and b/armor_nether/textures/3d_armor_inv_boots_nether.png differ
diff --git a/armor_nether/textures/3d_armor_inv_chestplate_nether.png b/armor_nether/textures/3d_armor_inv_chestplate_nether.png
new file mode 100644
index 0000000..8fa2aec
Binary files /dev/null and b/armor_nether/textures/3d_armor_inv_chestplate_nether.png differ
diff --git a/armor_nether/textures/3d_armor_inv_helmet_nether.png b/armor_nether/textures/3d_armor_inv_helmet_nether.png
new file mode 100644
index 0000000..2882244
Binary files /dev/null and b/armor_nether/textures/3d_armor_inv_helmet_nether.png differ
diff --git a/armor_nether/textures/3d_armor_inv_leggings_nether.png b/armor_nether/textures/3d_armor_inv_leggings_nether.png
new file mode 100644
index 0000000..94b0876
Binary files /dev/null and b/armor_nether/textures/3d_armor_inv_leggings_nether.png differ
diff --git a/armor_nether/textures/3d_armor_leggings_nether.png b/armor_nether/textures/3d_armor_leggings_nether.png
new file mode 100644
index 0000000..772c486
Binary files /dev/null and b/armor_nether/textures/3d_armor_leggings_nether.png differ
diff --git a/armor_nether/textures/3d_armor_leggings_nether_preview.png b/armor_nether/textures/3d_armor_leggings_nether_preview.png
new file mode 100644
index 0000000..32bceb8
Binary files /dev/null and b/armor_nether/textures/3d_armor_leggings_nether_preview.png differ
diff --git a/armor_steel/LICENSE.txt b/armor_steel/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_steel/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_steel/depends.txt b/armor_steel/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_steel/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_steel/description.txt b/armor_steel/description.txt
new file mode 100644
index 0000000..0d5b016
--- /dev/null
+++ b/armor_steel/description.txt
@@ -0,0 +1 @@
+Adds craftable steel armor.
\ No newline at end of file
diff --git a/armor_steel/init.lua b/armor_steel/init.lua
new file mode 100644
index 0000000..a104e71
--- /dev/null
+++ b/armor_steel/init.lua
@@ -0,0 +1,181 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Steel
+--
+--  Requires setting `armor_material_steel`.
+--
+--  @section steel
+
+if armor.materials.steel then
+	--- Steel Helmet
+	--
+	--  @helmet 3d_armor:helmet_steel
+	--  @img 3d_armor_inv_helmet_steel.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 800
+	--  @grp physics_speed -0.01
+	--  @grp physica_gravity 0.01
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:helmet_steel", {
+		description = S("Steel Helmet"),
+		inventory_image = "3d_armor_inv_helmet_steel.png",
+		groups = {armor_head=1, armor_heal=0, armor_use=800,
+			physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
+	})
+	--- Steel Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_steel
+	--  @img 3d_armor_inv_chestplate_steel.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 800
+	--  @grp physics_speed
+	--  @grp physics_gravity
+	--  @armorgrp fleshy
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:chestplate_steel", {
+		description = S("Steel Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_steel.png",
+		groups = {armor_torso=1, armor_heal=0, armor_use=800,
+			physics_speed=-0.04, physics_gravity=0.04},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
+	})
+	--- Steel Leggings
+	--
+	--  @leggings 3d_armor:leggings_steel
+	--  @img 3d_armor_inv_leggings_steel.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 800
+	--  @grp physics_speed -0.03
+	--  @grp physics_gravity 0.03
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:leggings_steel", {
+		description = S("Steel Leggings"),
+		inventory_image = "3d_armor_inv_leggings_steel.png",
+		groups = {armor_legs=1, armor_heal=0, armor_use=800,
+			physics_speed=-0.03, physics_gravity=0.03},
+		armor_groups = {fleshy=15},
+		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
+	})
+	--- Steel Boots
+	--
+	--  @boots 3d_armor:boots_steel
+	--  @img 3d_armor_inv_boots_steel.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 800
+	--  @grp physics_speed -0.01
+	--  @grp physics_gravity 0.01
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
+	armor:register_armor(":3d_armor:boots_steel", {
+		description = S("Steel Boots"),
+		inventory_image = "3d_armor_inv_boots_steel.png",
+		groups = {armor_feet=1, armor_heal=0, armor_use=800,
+			physics_speed=-0.01, physics_gravity=0.01},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
+	})
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "steel"
+	local m = armor.materials.steel
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.de.tr b/armor_steel/locale/armor_steel.de.tr
new file mode 100644
index 0000000..04538be
--- /dev/null
+++ b/armor_steel/locale/armor_steel.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Stahlstiefel
+Steel Chestplate=Stahlbrustplatte
+Steel Helmet=Stahlhelm
+Steel Leggings=Stahlhose
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.eo.tr b/armor_steel/locale/armor_steel.eo.tr
new file mode 100644
index 0000000..37f5249
--- /dev/null
+++ b/armor_steel/locale/armor_steel.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_steel
+
+Steel Helmet=Ŝtala Kasko
+Steel Chestplate=Ŝtala Brustkiraso
+Steel Leggings=Ŝtala Pantalono
+Steel Boots=Ŝtala Botoj
diff --git a/armor_steel/locale/armor_steel.es.tr b/armor_steel/locale/armor_steel.es.tr
new file mode 100644
index 0000000..6e71830
--- /dev/null
+++ b/armor_steel/locale/armor_steel.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Botas de acero
+Steel Chestplate=Peto de acero
+Steel Helmet=Casco de acero
+Steel Leggings=Grebas de acero
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.fr.tr b/armor_steel/locale/armor_steel.fr.tr
new file mode 100644
index 0000000..d74fd9f
--- /dev/null
+++ b/armor_steel/locale/armor_steel.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Bottes en acier
+Steel Chestplate=Cuirasse en acier
+Steel Helmet=Casque en acier
+Steel Leggings=Jambières en acier
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.it.tr b/armor_steel/locale/armor_steel.it.tr
new file mode 100644
index 0000000..38095a0
--- /dev/null
+++ b/armor_steel/locale/armor_steel.it.tr
@@ -0,0 +1,13 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Stivali d'acciaio
+Steel Chestplate=Corazza d'acciaio
+Steel Helmet=Elmo d'acciaio
+Steel Leggings=Gambali d'acciaio
+Wood Boots=Stivali di legno
+Wood Chestplate=Corazza di legno
+Wood Helmet=Elmo di legno
+Wood Leggings=Gambali di legno
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.ms.tr b/armor_steel/locale/armor_steel.ms.tr
new file mode 100644
index 0000000..2d9fe08
--- /dev/null
+++ b/armor_steel/locale/armor_steel.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=But Keluli
+Steel Chestplate=Perisai Dada Keluli
+Steel Helmet=Helmet Keluli
+Steel Leggings=Perisai Kaki Keluli
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.pt.tr b/armor_steel/locale/armor_steel.pt.tr
new file mode 100644
index 0000000..f898a11
--- /dev/null
+++ b/armor_steel/locale/armor_steel.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Botas de Aço
+Steel Chestplate=Peitoral de Aço
+Steel Helmet=Capacete de Aço
+Steel Leggings=Calças de Aço
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.pt_BR.tr b/armor_steel/locale/armor_steel.pt_BR.tr
new file mode 100644
index 0000000..f898a11
--- /dev/null
+++ b/armor_steel/locale/armor_steel.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=Botas de Aço
+Steel Chestplate=Peitoral de Aço
+Steel Helmet=Capacete de Aço
+Steel Leggings=Calças de Aço
\ No newline at end of file
diff --git a/armor_steel/locale/armor_steel.ru.tr b/armor_steel/locale/armor_steel.ru.tr
new file mode 100644
index 0000000..d7fcf18
--- /dev/null
+++ b/armor_steel/locale/armor_steel.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=стальные ботинки
+Steel Chestplate=стальной бронежилет
+Steel Helmet=стальной шлем
+Steel Leggings=стальные гамаши
\ No newline at end of file
diff --git a/armor_steel/locale/template.txt b/armor_steel/locale/template.txt
new file mode 100644
index 0000000..7438e0f
--- /dev/null
+++ b/armor_steel/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_steel
+
+
+### init.lua ###
+
+Steel Boots=
+Steel Chestplate=
+Steel Helmet=
+Steel Leggings=
\ No newline at end of file
diff --git a/armor_steel/mod.conf b/armor_steel/mod.conf
new file mode 100644
index 0000000..962e756
--- /dev/null
+++ b/armor_steel/mod.conf
@@ -0,0 +1,3 @@
+name = armor_steel
+depends = 3d_armor
+description = Adds craftable steel armor.
diff --git a/3d_armor/textures/3d_armor_boots_steel.png b/armor_steel/textures/3d_armor_boots_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_steel.png
rename to armor_steel/textures/3d_armor_boots_steel.png
diff --git a/3d_armor/textures/3d_armor_boots_steel_preview.png b/armor_steel/textures/3d_armor_boots_steel_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_steel_preview.png
rename to armor_steel/textures/3d_armor_boots_steel_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_steel.png b/armor_steel/textures/3d_armor_chestplate_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_steel.png
rename to armor_steel/textures/3d_armor_chestplate_steel.png
diff --git a/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/armor_steel/textures/3d_armor_chestplate_steel_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_steel_preview.png
rename to armor_steel/textures/3d_armor_chestplate_steel_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_steel.png b/armor_steel/textures/3d_armor_helmet_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_steel.png
rename to armor_steel/textures/3d_armor_helmet_steel.png
diff --git a/3d_armor/textures/3d_armor_helmet_steel_preview.png b/armor_steel/textures/3d_armor_helmet_steel_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_steel_preview.png
rename to armor_steel/textures/3d_armor_helmet_steel_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_steel.png b/armor_steel/textures/3d_armor_inv_boots_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_steel.png
rename to armor_steel/textures/3d_armor_inv_boots_steel.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_steel.png b/armor_steel/textures/3d_armor_inv_chestplate_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_steel.png
rename to armor_steel/textures/3d_armor_inv_chestplate_steel.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_steel.png b/armor_steel/textures/3d_armor_inv_helmet_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_steel.png
rename to armor_steel/textures/3d_armor_inv_helmet_steel.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_steel.png b/armor_steel/textures/3d_armor_inv_leggings_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_steel.png
rename to armor_steel/textures/3d_armor_inv_leggings_steel.png
diff --git a/3d_armor/textures/3d_armor_leggings_steel.png b/armor_steel/textures/3d_armor_leggings_steel.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_steel.png
rename to armor_steel/textures/3d_armor_leggings_steel.png
diff --git a/3d_armor/textures/3d_armor_leggings_steel_preview.png b/armor_steel/textures/3d_armor_leggings_steel_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_steel_preview.png
rename to armor_steel/textures/3d_armor_leggings_steel_preview.png
diff --git a/armor_wood/LICENSE.txt b/armor_wood/LICENSE.txt
new file mode 100644
index 0000000..f253f29
--- /dev/null
+++ b/armor_wood/LICENSE.txt
@@ -0,0 +1,26 @@
+[mod] 3d Armor [3d_armor]
+=========================
+
+License Source Code
+-------------------
+
+Copyright (C) 2012-2019 stujones11, Stuart Jones <stujones111@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+License Textures
+----------------
+
+Copyright (C) 2017-2019 davidthecreator - CC-BY-SA 3.0
diff --git a/armor_wood/depends.txt b/armor_wood/depends.txt
new file mode 100644
index 0000000..b6cac21
--- /dev/null
+++ b/armor_wood/depends.txt
@@ -0,0 +1 @@
+3d_armor
diff --git a/armor_wood/description.txt b/armor_wood/description.txt
new file mode 100644
index 0000000..482871d
--- /dev/null
+++ b/armor_wood/description.txt
@@ -0,0 +1 @@
+Adds craftable wood armor.
\ No newline at end of file
diff --git a/armor_wood/init.lua b/armor_wood/init.lua
new file mode 100644
index 0000000..0496e77
--- /dev/null
+++ b/armor_wood/init.lua
@@ -0,0 +1,186 @@
+
+--- Registered armors.
+--
+--  @topic armor
+
+
+-- support for i18n
+local S = armor.get_translator
+
+--- Wood
+--
+--  Requires setting `armor_material_wood`.
+--
+--  @section wood
+
+if armor.materials.wood then
+	--- Wood Helmet
+	--
+	--  @helmet 3d_armor:helmet_wood
+	--  @img 3d_armor_inv_helmet_wood.png
+	--  @grp armor_head 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 2000
+	--  @grp flammable 1
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:helmet_wood", {
+		description = S("Wood Helmet"),
+		inventory_image = "3d_armor_inv_helmet_wood.png",
+		groups = {armor_head=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},
+	})
+	--- Wood Chestplate
+	--
+	--  @chestplate 3d_armor:chestplate_wood
+	--  @img 3d_armor_inv_chestplate_wood.png
+	--  @grp armor_torso 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 2000
+	--  @grp flammable 1
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:chestplate_wood", {
+		description = S("Wood Chestplate"),
+		inventory_image = "3d_armor_inv_chestplate_wood.png",
+		groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
+	})
+	--- Wood Leggings
+	--
+	--  @leggings 3d_armor:leggings_wood
+	--  @img 3d_armor_inv_leggings_wood.png
+	--  @grp armor_legs 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @grp flammable 1
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:leggings_wood", {
+		description = S("Wood Leggings"),
+		inventory_image = "3d_armor_inv_leggings_wood.png",
+		groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1},
+		armor_groups = {fleshy=10},
+		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
+	})
+	--- Wood Boots
+	--
+	--  @boots 3d_armor:boots_wood
+	--  @img 3d_armor_inv_boots_wood.png
+	--  @grp armor_feet 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 2000
+	--  @grp flammable 1
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
+	armor:register_armor(":3d_armor:boots_wood", {
+		description = S("Wood Boots"),
+		inventory_image = "3d_armor_inv_boots_wood.png",
+		armor_groups = {fleshy=5},
+		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
+		groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1},
+	})
+	local wood_armor_fuel = {
+		helmet = 6,
+		chestplate = 8,
+		leggings = 7,
+		boots = 5
+	}
+	for armor, burn in pairs(wood_armor_fuel) do
+		minetest.register_craft({
+			type = "fuel",
+			recipe = "3d_armor:" .. armor .. "_wood",
+			burntime = burn,
+		})
+	end
+
+	--- Crafting
+	--
+	--  @section craft
+
+	--- Craft recipes for helmets, chestplates, leggings, boots, & shields.
+	--
+	--  @craft armor
+	--  @usage
+	--  Key:
+	--  - m: material
+	--    - wood:    group:wood
+	--    - cactus:  default:cactus
+	--    - steel:   default:steel_ingot
+	--    - bronze:  default:bronze_ingot
+	--    - diamond: default:diamond
+	--    - gold:    default:gold_ingot
+	--    - mithril: moreores:mithril_ingot
+	--    - crystal: ethereal:crystal_ingot
+	--    - nether:  nether:nether_ingot
+	--
+	--  helmet:        chestplate:    leggings:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │   │   │   │  │ m │ m │ m │  │ m │   │ m │
+	--  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘
+	--
+	--  boots:         shield:
+	--  ┌───┬───┬───┐  ┌───┬───┬───┐
+	--  │   │   │   │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │ m │ m │ m │
+	--  ├───┼───┼───┤  ├───┼───┼───┤
+	--  │ m │   │ m │  │   │ m │   │
+	--  └───┴───┴───┘  └───┴───┴───┘
+
+	local s = "wood"
+	local m = armor.materials.wood
+	minetest.register_craft({
+		output = "3d_armor:helmet_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{"", "", ""},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:chestplate_"..s,
+		recipe = {
+			{m, "", m},
+			{m, m, m},
+			{m, m, m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:leggings_"..s,
+		recipe = {
+			{m, m, m},
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+	minetest.register_craft({
+		output = "3d_armor:boots_"..s,
+		recipe = {
+			{m, "", m},
+			{m, "", m},
+		},
+	})
+end
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.de.tr b/armor_wood/locale/armor_wood.de.tr
new file mode 100644
index 0000000..35a7379
--- /dev/null
+++ b/armor_wood/locale/armor_wood.de.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Holzstiefel
+Wood Chestplate=Holzbrustplatte
+Wood Helmet=Holzhelm
+Wood Leggings=Holzhose
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.eo.tr b/armor_wood/locale/armor_wood.eo.tr
new file mode 100644
index 0000000..9165e8f
--- /dev/null
+++ b/armor_wood/locale/armor_wood.eo.tr
@@ -0,0 +1,6 @@
+# textdomain: armor_wood
+
+Wood Helmet=Ligna Kasko
+Wood Chestplate=Ligna Brustkiraso
+Wood Leggings=Ligna Pantalono
+Wood Boots=Ligna Botoj
diff --git a/armor_wood/locale/armor_wood.es.tr b/armor_wood/locale/armor_wood.es.tr
new file mode 100644
index 0000000..a31e031
--- /dev/null
+++ b/armor_wood/locale/armor_wood.es.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Botas de madera
+Wood Chestplate=Peto de madera
+Wood Helmet=Casco de madera
+Wood Leggings=Grebas de madera
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.fr.tr b/armor_wood/locale/armor_wood.fr.tr
new file mode 100644
index 0000000..3530b7a
--- /dev/null
+++ b/armor_wood/locale/armor_wood.fr.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Bottes en bois
+Wood Chestplate=Cuirasse en bois
+Wood Helmet=Casque en bois
+Wood Leggings=Jambières en bois
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.it.tr b/armor_wood/locale/armor_wood.it.tr
new file mode 100644
index 0000000..e14301f
--- /dev/null
+++ b/armor_wood/locale/armor_wood.it.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Stivali di legno
+Wood Chestplate=Corazza di legno
+Wood Helmet=Elmo di legno
+Wood Leggings=Gambali di legno
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.ms.tr b/armor_wood/locale/armor_wood.ms.tr
new file mode 100644
index 0000000..55ad062
--- /dev/null
+++ b/armor_wood/locale/armor_wood.ms.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=But Kayu
+Wood Chestplate=Perisai Dada Kayu
+Wood Helmet=Helmet Kayu
+Wood Leggings=Perisai Kaki Kayu
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.pt.tr b/armor_wood/locale/armor_wood.pt.tr
new file mode 100644
index 0000000..92f7d46
--- /dev/null
+++ b/armor_wood/locale/armor_wood.pt.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Botas de Madeira
+Wood Chestplate=Peitoral de Madeira
+Wood Helmet=Capacete de Madeira
+Wood Leggings=Calças de Madeira
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.pt_BR.tr b/armor_wood/locale/armor_wood.pt_BR.tr
new file mode 100644
index 0000000..92f7d46
--- /dev/null
+++ b/armor_wood/locale/armor_wood.pt_BR.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=Botas de Madeira
+Wood Chestplate=Peitoral de Madeira
+Wood Helmet=Capacete de Madeira
+Wood Leggings=Calças de Madeira
\ No newline at end of file
diff --git a/armor_wood/locale/armor_wood.ru.tr b/armor_wood/locale/armor_wood.ru.tr
new file mode 100644
index 0000000..f0bed03
--- /dev/null
+++ b/armor_wood/locale/armor_wood.ru.tr
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=деревянные ботинки
+Wood Chestplate=деревянный бронежилет
+Wood Helmet=деревянный шлем
+Wood Leggings=деревянные гамаши
\ No newline at end of file
diff --git a/armor_wood/locale/template.txt b/armor_wood/locale/template.txt
new file mode 100644
index 0000000..57bb7e6
--- /dev/null
+++ b/armor_wood/locale/template.txt
@@ -0,0 +1,9 @@
+# textdomain: armor_wood
+
+
+### init.lua ###
+
+Wood Boots=
+Wood Chestplate=
+Wood Helmet=
+Wood Leggings=
\ No newline at end of file
diff --git a/armor_wood/mod.conf b/armor_wood/mod.conf
new file mode 100644
index 0000000..2155fa3
--- /dev/null
+++ b/armor_wood/mod.conf
@@ -0,0 +1,3 @@
+name = armor_wood
+depends = 3d_armor
+description = Adds craftable wood armor.
diff --git a/3d_armor/textures/3d_armor_boots_wood.png b/armor_wood/textures/3d_armor_boots_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_wood.png
rename to armor_wood/textures/3d_armor_boots_wood.png
diff --git a/3d_armor/textures/3d_armor_boots_wood_preview.png b/armor_wood/textures/3d_armor_boots_wood_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_boots_wood_preview.png
rename to armor_wood/textures/3d_armor_boots_wood_preview.png
diff --git a/3d_armor/textures/3d_armor_chestplate_wood.png b/armor_wood/textures/3d_armor_chestplate_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_wood.png
rename to armor_wood/textures/3d_armor_chestplate_wood.png
diff --git a/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/armor_wood/textures/3d_armor_chestplate_wood_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_chestplate_wood_preview.png
rename to armor_wood/textures/3d_armor_chestplate_wood_preview.png
diff --git a/3d_armor/textures/3d_armor_helmet_wood.png b/armor_wood/textures/3d_armor_helmet_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_wood.png
rename to armor_wood/textures/3d_armor_helmet_wood.png
diff --git a/3d_armor/textures/3d_armor_helmet_wood_preview.png b/armor_wood/textures/3d_armor_helmet_wood_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_helmet_wood_preview.png
rename to armor_wood/textures/3d_armor_helmet_wood_preview.png
diff --git a/3d_armor/textures/3d_armor_inv_boots_wood.png b/armor_wood/textures/3d_armor_inv_boots_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_boots_wood.png
rename to armor_wood/textures/3d_armor_inv_boots_wood.png
diff --git a/3d_armor/textures/3d_armor_inv_chestplate_wood.png b/armor_wood/textures/3d_armor_inv_chestplate_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_chestplate_wood.png
rename to armor_wood/textures/3d_armor_inv_chestplate_wood.png
diff --git a/3d_armor/textures/3d_armor_inv_helmet_wood.png b/armor_wood/textures/3d_armor_inv_helmet_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_helmet_wood.png
rename to armor_wood/textures/3d_armor_inv_helmet_wood.png
diff --git a/3d_armor/textures/3d_armor_inv_leggings_wood.png b/armor_wood/textures/3d_armor_inv_leggings_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_inv_leggings_wood.png
rename to armor_wood/textures/3d_armor_inv_leggings_wood.png
diff --git a/3d_armor/textures/3d_armor_leggings_wood.png b/armor_wood/textures/3d_armor_leggings_wood.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_wood.png
rename to armor_wood/textures/3d_armor_leggings_wood.png
diff --git a/3d_armor/textures/3d_armor_leggings_wood_preview.png b/armor_wood/textures/3d_armor_leggings_wood_preview.png
similarity index 100%
rename from 3d_armor/textures/3d_armor_leggings_wood_preview.png
rename to armor_wood/textures/3d_armor_leggings_wood_preview.png
diff --git a/debian/changelog b/debian/changelog
index b12cc63..c829817 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+minetest-mod-3d-armor (0.4.14+git20221116.1.04b45de-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 17 Nov 2022 22:22:18 -0000
+
 minetest-mod-3d-armor (0.4.14-2) unstable; urgency=medium
 
   * Re-upload source-only for testing migration.
diff --git a/modpack.conf b/modpack.conf
index 4e64251..bf746c5 100644
--- a/modpack.conf
+++ b/modpack.conf
@@ -1,2 +1 @@
-name = minetest-3d_armor
 description = Visible player armor & wielded items.
diff --git a/screenshot.png b/screenshot.png
index c1f9e58..637944a 100644
Binary files a/screenshot.png and b/screenshot.png differ
diff --git a/screenshot.xcf b/screenshot.xcf
new file mode 100644
index 0000000..17ea7c9
Binary files /dev/null and b/screenshot.xcf differ
diff --git a/settingtypes.txt b/settingtypes.txt
index c6c90de..3606dcd 100644
--- a/settingtypes.txt
+++ b/settingtypes.txt
@@ -1,4 +1,3 @@
-
 [3d_armor]
 
 armor_material_wood (Enable wood armor) bool true
@@ -9,6 +8,7 @@ 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
+armor_material_nether (Enable nether armor) bool true
 
 # Increase this if you get initialization glitches when a player first joins.
 armor_init_delay (Initialization delay) int 2
@@ -38,18 +38,30 @@ armor_level_multiplier (Armor effectiveness multiplier) float 1
 # eg: armor_heal_multiplier = 0 will disable healing altogether.
 armor_heal_multiplier (Armor healing multiplier) float 1
 
+# Armor set item names, remove or add items to include them or remove them from whats considered an Armor set.
+armor_set_elements (Armor set items) string head torso legs feet shield
+
+# Bonus multiplier when wearing armor set, set to the same as armor_level_multiplier to disable
+armor_set_multiplier (Armor Set Bonus multiplier) float 1.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 fire damage from torches (defaults true if using ethereal mod).
+armor_fire_protect_torch (Enable fire protection torch damage) 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
 
+# Armor is not visible on player model when enabled.
+armor_transparent (Transparent armor) bool false
+
 
 [shields]
 
diff --git a/shields/crafting_guide.txt b/shields/crafting_guide.txt
index 9b61dde..689da8c 100644
--- a/shields/crafting_guide.txt
+++ b/shields/crafting_guide.txt
@@ -17,6 +17,7 @@ Shields -- Crafting Guide
 [shields:shield_gold] X = [default:gold_ingot]
 [shields:shield_mithril] X = [moreores:mithril_ingot]
 [shields:shield_crystal] X = [ethereal:crystal_ingot]
+[shields:shield_nether] X = [ethereal:nether_ingot]
 
 Enhanced Shields
 ----------------
diff --git a/shields/init.lua b/shields/init.lua
index 754b093..3b2b43c 100644
--- a/shields/init.lua
+++ b/shields/init.lua
@@ -1,5 +1,11 @@
+
+--- 3D Armor Shields
+--
+--  @topic shields
+
+
 -- support for i18n
-local S = armor_i18n.gettext
+local S = minetest.get_translator(minetest.get_current_modname())
 
 local disable_sounds = minetest.settings:get_bool("shields_disable_sounds")
 local function play_sound_effect(player, name)
@@ -17,12 +23,18 @@ 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
 
+--- Admin Shield
+--
+--  @shield shields:shield_admin
+--  @img shields_inv_shield_admin.png
+--  @grp armor_shield 1000
+--  @grp armor_heal 100
+--  @grp armor_use 0
+--  @grp not_int_creative_inventory 1
 armor:register_armor("shields:shield_admin", {
 	description = S("Admin Shield"),
 	inventory_image = "shields_inv_shield_admin.png",
@@ -31,7 +43,22 @@ armor:register_armor("shields:shield_admin", {
 
 minetest.register_alias("adminshield", "shields:shield_admin")
 
+
 if armor.materials.wood then
+	--- Wood Shield
+	--
+	--  @shield shields:shield_wood
+	--  @img shields_inv_shield_wood.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 2000
+	--  @grp flammable 1
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
 	armor:register_armor("shields:shield_wood", {
 		description = S("Wooden Shield"),
 		inventory_image = "shields_inv_shield_wood.png",
@@ -46,6 +73,19 @@ if armor.materials.wood then
 			play_sound_effect(player, "default_wood_footstep")
 		end,
 	})
+	--- Enhanced Wood Shield
+	--
+	--  @shield shields:shield_enhanced_wood
+	--  @img shields_inv_shield_enhanced_wood.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 2000
+	--  @armorgrp fleshy 8
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 3
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 2
 	armor:register_armor("shields:shield_enhanced_wood", {
 		description = S("Enhanced Wood Shield"),
 		inventory_image = "shields_inv_shield_enhanced_wood.png",
@@ -76,6 +116,19 @@ if armor.materials.wood then
 end
 
 if armor.materials.cactus then
+	--- Cactus Shield
+	--
+	--  @shield shields:shield_cactus
+	--  @img shields_inv_shield_cactus.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 5
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 1
 	armor:register_armor("shields:shield_cactus", {
 		description = S("Cactus Shield"),
 		inventory_image = "shields_inv_shield_cactus.png",
@@ -90,6 +143,19 @@ if armor.materials.cactus then
 			play_sound_effect(player, "default_wood_footstep")
 		end,
 	})
+	--- Enhanced Cactus Shield
+	--
+	--  @shield shields:shield_enhanced_cactus
+	--  @img shields_inv_shield_enhanced_cactus.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 1000
+	--  @armorgrp fleshy 8
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 2
+	--  @damagegrp level 2
 	armor:register_armor("shields:shield_enhanced_cactus", {
 		description = S("Enhanced Cactus Shield"),
 		inventory_image = "shields_inv_shield_enhanced_cactus.png",
@@ -120,6 +186,21 @@ if armor.materials.cactus then
 end
 
 if armor.materials.steel then
+	--- Steel Shield
+	--
+	--  @shield shields:shield_steel
+	--  @img shields_inv_shield_steel.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 0
+	--  @grp armor_use 800
+	--  @grp physics_speed -0.03
+	--  @grp physics_gravity 0.03
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
 	armor:register_armor("shields:shield_steel", {
 		description = S("Steel Shield"),
 		inventory_image = "shields_inv_shield_steel.png",
@@ -138,6 +219,21 @@ if armor.materials.steel then
 end
 
 if armor.materials.bronze then
+	--- Bronze Shield
+	--
+	--  @shield shields:shield_bronze
+	--  @img shields_inv_shield_bronze.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 400
+	--  @grp physics_speed -0.03
+	--  @grp physics_gravity 0.03
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 3
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 1
+	--  @damagegrp level 2
 	armor:register_armor("shields:shield_bronze", {
 		description = S("Bronze Shield"),
 		inventory_image = "shields_inv_shield_bronze.png",
@@ -156,6 +252,18 @@ if armor.materials.bronze then
 end
 
 if armor.materials.diamond then
+	--- Diamond Shield
+	--
+	--  @shield shields:shield_diamond
+	--  @img shields_inv_shield_diamond.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 200
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp choppy 1
+	--  @damagegrp level 3
 	armor:register_armor("shields:shield_diamond", {
 		description = S("Diamond Shield"),
 		inventory_image = "shields_inv_shield_diamond.png",
@@ -173,6 +281,21 @@ if armor.materials.diamond then
 end
 
 if armor.materials.gold then
+	--- Gold Shield
+	--
+	--  @shield shields:shield_gold
+	--  @img shields_inv_shield_gold.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 6
+	--  @grp armor_use 300
+	--  @grp physics_speed -0.04
+	--  @grp physics_gravity 0.04
+	--  @armorgrp fleshy 10
+	--  @damagegrp cracky 1
+	--  @damagegrp snappy 2
+	--  @damagegrp choppy 2
+	--  @damagegrp crumbly 3
+	--  @damagegrp level 2
 	armor:register_armor("shields:shield_gold", {
 		description = S("Gold Shield"),
 		inventory_image = "shields_inv_shield_gold.png",
@@ -191,11 +314,22 @@ if armor.materials.gold then
 end
 
 if armor.materials.mithril then
+	--- Mithril Shield
+	--
+	--  @shield shields:shield_mithril
+	--  @img shields_inv_shield_mithril.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
 	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},
+		groups = {armor_shield=1, armor_heal=13, armor_use=66},
+		armor_groups = {fleshy=16},
 		damage_groups = {cracky=2, snappy=1, level=3},
 		reciprocate_damage = true,
 		on_damage = function(player, index, stack)
@@ -208,6 +342,18 @@ if armor.materials.mithril then
 end
 
 if armor.materials.crystal then
+	--- Crystal Shield
+	--
+	--  @shield shields:shield_crystal
+	--  @img shields_inv_shield_crystal.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 12
+	--  @grp armor_use 100
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 15
+	--  @damagegrp cracky 2
+	--  @damagegrp snappy 1
+	--  @damagegrp level 3
 	armor:register_armor("shields:shield_crystal", {
 		description = S("Crystal Shield"),
 		inventory_image = "shields_inv_shield_crystal.png",
@@ -224,6 +370,35 @@ if armor.materials.crystal then
 	})
 end
 
+if armor.materials.nether then
+	--- Nether Shield
+	--
+	--  @shield shields:shield_nether
+	--  @img shields_inv_shield_nether.png
+	--  @grp armor_shield 1
+	--  @grp armor_heal 17
+	--  @grp armor_use 200
+	--  @grp armor_fire 1
+	--  @armorgrp fleshy 20
+	--  @damagegrp cracky 3
+	--  @damagegrp snappy 2
+	--  @damagegrp level 3
+	armor:register_armor("shields:shield_nether", {
+		description = S("Nether Shield"),
+		inventory_image = "shields_inv_shield_nether.png",
+		groups = {armor_shield=1, armor_heal=17, armor_use=200, armor_fire=1},
+		armor_groups = {fleshy=20},
+		damage_groups = {cracky=3, snappy=2, 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,
diff --git a/shields/locale/shields.de.tr b/shields/locale/shields.de.tr
new file mode 100644
index 0000000..341563c
--- /dev/null
+++ b/shields/locale/shields.de.tr
@@ -0,0 +1,17 @@
+# textdomain: shields
+
+
+### init.lua ###
+
+Admin Shield=Adminschild
+Bronze Shield=Bronzeschild
+Cactus Shield=Kaktusschild
+Crystal Shield=Kristallschild
+Nether Shield=Netherschild
+Diamond Shield=Diamantschild
+Enhanced Cactus Shield=verbessert Kaktusschild
+Enhanced Wood Shield=verbessert Holzschild
+Gold Shield=Goldschild
+Mithril Shield=Mithrilschild
+Steel Shield=Stahlschild
+Wooden Shield=Holzschild
diff --git a/shields/locale/shields.eo.tr b/shields/locale/shields.eo.tr
new file mode 100644
index 0000000..cfb3f27
--- /dev/null
+++ b/shields/locale/shields.eo.tr
@@ -0,0 +1,14 @@
+# textdomain: shields
+
+Admin Shield=Administra Ŝildo
+Wooden Shield=Ligna Ŝildo
+Enhanced Wood Shield=Plibonigita Ligna Ŝildo
+Cactus Shield=Kakta Ŝildo
+Enhanced Cactus Shield=Plibonigita Kakta Ŝildo
+Steel Shield=Ŝtala Ŝildo
+Bronze Shield=Bronza Ŝildo
+Diamond Shield=Diamanta Ŝildo
+Gold Shield=Ora Ŝildo
+Mithril Shield=Mitrila Ŝildo
+Crystal Shield=Kristala Ŝildo
+Nether Shield=Inferna Ŝildo
diff --git a/shields/locale/shields.fr.tr b/shields/locale/shields.fr.tr
new file mode 100644
index 0000000..081c794
--- /dev/null
+++ b/shields/locale/shields.fr.tr
@@ -0,0 +1,17 @@
+# textdomain: shields
+
+
+### init.lua ###
+
+Admin Shield=Bouclier d'admin
+Bronze Shield=Bouclier en bronze
+Cactus Shield=Bouclier en cactus
+Crystal Shield=Bouclier en cristal
+Nether Shield=Bouclier en nether
+Diamond Shield=Bouclier en diamant
+Enhanced Cactus Shield=Bouclier en cactus amélioré
+Enhanced Wood Shield=Bouclier en bois amélioré
+Gold Shield=Bouclier en or
+Mithril Shield=Bouclier en mithril
+Steel Shield=Bouclier en acier
+Wooden Shield=Bouclier en bois
diff --git a/shields/locale/shields.pt_BR.tr b/shields/locale/shields.pt_BR.tr
new file mode 100644
index 0000000..08c6c74
--- /dev/null
+++ b/shields/locale/shields.pt_BR.tr
@@ -0,0 +1,17 @@
+# textdomain: shields
+
+
+### init.lua ###
+
+Admin Shield=Escudo de Administrador
+Bronze Shield=Escudo de Bronze
+Cactus Shield=Escudo de Cacto
+Crystal Shield=Escudo de Cristal
+Nether Shield=Escudo de Nether
+Diamond Shield=Escudo de Diamante
+Enhanced Cactus Shield=Escude de Cacto Encantado
+Enhanced Wood Shield=Escudo de Madeira Encantado
+Gold Shield=Escudo de Ouro
+Mithril Shield=Escudo de Mithril
+Steel Shield=Escudo de Aço
+Wooden Shield=Escudo de Madeira
diff --git a/shields/locale/template.txt b/shields/locale/template.txt
new file mode 100644
index 0000000..9c30ca7
--- /dev/null
+++ b/shields/locale/template.txt
@@ -0,0 +1,17 @@
+# textdomain: shields
+
+
+### init.lua ###
+
+Admin Shield=
+Bronze Shield=
+Cactus Shield=
+Crystal Shield=
+Nether Shield=
+Diamond Shield=
+Enhanced Cactus Shield=
+Enhanced Wood Shield=
+Gold Shield=
+Mithril Shield=
+Steel Shield=
+Wooden Shield=
diff --git a/shields/textures/preview_index.txt b/shields/textures/preview_index.txt
index 4408c61..8298ea7 100644
--- a/shields/textures/preview_index.txt
+++ b/shields/textures/preview_index.txt
@@ -8,4 +8,5 @@ shields/textures/shields_shield_gold.png:shield
 shields/textures/shields_shield_diamond.png:shield
 shields/textures/shields_shield_mithril.png:shield
 shields/textures/shields_shield_crystal.png:shield
+shields/textures/shields_shield_nether.png:shield
 shields/textures/shields_shield_admin.png:shield
diff --git a/shields/textures/shields_inv_shield_nether.png b/shields/textures/shields_inv_shield_nether.png
new file mode 100644
index 0000000..dbafb53
Binary files /dev/null and b/shields/textures/shields_inv_shield_nether.png differ
diff --git a/shields/textures/shields_shield_nether.png b/shields/textures/shields_shield_nether.png
new file mode 100644
index 0000000..e7e3da2
Binary files /dev/null and b/shields/textures/shields_shield_nether.png differ
diff --git a/shields/textures/shields_shield_nether_preview.png b/shields/textures/shields_shield_nether_preview.png
new file mode 100644
index 0000000..a54a64b
Binary files /dev/null and b/shields/textures/shields_shield_nether_preview.png differ
diff --git a/wieldview/README.txt b/wieldview/README.txt
index ffa5ef0..3a8b640 100644
--- a/wieldview/README.txt
+++ b/wieldview/README.txt
@@ -21,3 +21,7 @@ Wield image transformation: To apply a simple transformation to the item in
 hand, add the group “wieldview_transform” to the item definition. The group
 rating equals one of the numbers used for the [transform texture modifier
 of the Lua API.
+
+Disabling the feature in-game: If you want to hide the wielded item
+you can add an INT metadata to the player called "show_wielded_item" and set
+it to 2 (any other value will show the wielded item again).
diff --git a/wieldview/get_texture.lua b/wieldview/get_texture.lua
new file mode 100644
index 0000000..31173c1
--- /dev/null
+++ b/wieldview/get_texture.lua
@@ -0,0 +1,215 @@
+local f = string.format
+
+local node_tiles = minetest.settings:get_bool("wieldview_node_tiles")
+if not node_tiles then
+	node_tiles = false
+	minetest.settings:set("wieldview_node_tiles", "false")
+end
+
+-- https://github.com/minetest/minetest/blob/9fc018ded10225589d2559d24a5db739e891fb31/doc/lua_api.txt#L453-L462
+local function escape_texture(texturestring)
+	-- store in a variable so we don't return both rvs of gsub
+	local v = texturestring:gsub("%^", "\\^"):gsub(":", "\\:")
+	return v
+end
+
+local function memoize(func)
+	local memo = {}
+	return function(arg)
+		if arg == nil then
+			return func(arg)
+		end
+		local rv = memo[arg]
+
+		if not rv then
+			rv = func(arg)
+			memo[arg] = rv
+		end
+
+		return rv
+	end
+end
+
+local function is_vertical_frames(animation)
+	return (
+		animation.type == "vertical_frames" and
+		animation.aspect_w and
+		animation.aspect_h
+	)
+end
+
+local function get_single_frame(animation, image_name)
+	return ("smartshop_animation_mask.png^[resize:%ix%i^[mask:%s"):format(
+		animation.aspect_w,
+		animation.aspect_h,
+		image_name
+	)
+end
+
+local function is_sheet_2d(animation)
+	return (
+		animation.type == "sheet_2d" and
+		animation.frames_w and
+		animation.frames_h
+	)
+end
+
+local function get_sheet_2d(animation, image_name)
+	return ("%s^[sheet:%ix%i:0,0"):format(
+		image_name,
+		animation.frames_w,
+		animation.frames_h
+	)
+end
+
+local get_image_from_tile = memoize(function(tile)
+	if type(tile) == "string" then
+		return tile
+
+	elseif type(tile) == "table" then
+		local image_name
+
+		if type(tile.image) == "string" then
+			image_name = tile.image
+
+		elseif type(tile.name) == "string" then
+			image_name = tile.name
+
+		end
+
+		if image_name then
+			local animation = tile.animation
+			if animation then
+				if is_vertical_frames(animation) then
+					return get_single_frame(animation, image_name)
+
+				elseif is_sheet_2d(animation) then
+					return get_sheet_2d(animation, image_name)
+				end
+			end
+
+			return image_name
+		end
+	end
+
+	return "3d_armor_trans.png"
+end)
+
+local function get_image_cube(tiles)
+	if #tiles >= 6 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[6] or "no_texture.png"),
+			get_image_from_tile(tiles[3] or "no_texture.png")
+		)
+
+	elseif #tiles == 5 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[5] or "no_texture.png"),
+			get_image_from_tile(tiles[3] or "no_texture.png")
+		)
+
+	elseif #tiles == 4 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[4] or "no_texture.png"),
+			get_image_from_tile(tiles[3] or "no_texture.png")
+		)
+
+	elseif #tiles == 3 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[3] or "no_texture.png"),
+			get_image_from_tile(tiles[3] or "no_texture.png")
+		)
+
+	elseif #tiles == 2 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[2] or "no_texture.png"),
+			get_image_from_tile(tiles[2] or "no_texture.png")
+		)
+
+	elseif #tiles == 1 then
+		return minetest.inventorycube(
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[1] or "no_texture.png"),
+			get_image_from_tile(tiles[1] or "no_texture.png")
+		)
+	end
+
+	return "3d_armor_trans.png"
+end
+
+local function is_normal_node(drawtype)
+	return (
+		drawtype == "normal" or
+		drawtype == "allfaces" or
+		drawtype == "allfaces_optional" or
+		drawtype == "glasslike" or
+		drawtype == "glasslike_framed" or
+		drawtype == "glasslike_framed_optional" or
+		drawtype == "liquid"
+	)
+end
+
+armor.get_wield_image = memoize(function(item)
+	item = ItemStack(item)
+
+	if item:is_empty() then
+		return "3d_armor_trans.png"
+	end
+
+	local def = item:get_definition()
+	if not def then
+		return "unknown_item.png"
+	end
+
+	local meta = item:get_meta()
+	local color = meta:get("color") or def.color
+
+	local image = "3d_armor_trans.png"
+
+	if def.wield_image and def.wield_image ~= "" then
+		local parts = {def.wield_image}
+		if color then
+			parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color))
+		end
+		if def.wield_overlay then
+			parts[#parts + 1] = def.wield_overlay
+		end
+		image = table.concat(parts, "^")
+
+	elseif def.inventory_image and def.inventory_image ~= "" then
+		local parts = {def.inventory_image}
+		if color then
+			parts[#parts + 1] = f("[colorize:%s:alpha", escape_texture(color))
+		end
+		if def.inventory_overlay then
+			parts[#parts + 1] = def.inventory_overlay
+		end
+		image = table.concat(parts, "^")
+
+	elseif def.type == "node" then
+		if def.drawtype == "nodebox" or def.drawtype == "mesh" then
+			image = "3d_armor_trans.png"
+
+		else
+			local tiles = def.tiles
+			if type(tiles) == "string" then
+				image = get_image_from_tile(tiles)
+
+			elseif type(tiles) == "table" then
+				if is_normal_node(def.drawtype) and node_tiles then
+					image = get_image_cube(tiles)
+
+				else
+					image = get_image_from_tile(tiles[1])
+				end
+			end
+		end
+	end
+
+	return image
+end)
diff --git a/wieldview/init.lua b/wieldview/init.lua
index 7f68732..ecdece9 100644
--- a/wieldview/init.lua
+++ b/wieldview/init.lua
@@ -4,31 +4,20 @@ if not update_time then
 	update_time = 2
 	minetest.settings:set("wieldview_update_time", tostring(update_time))
 end
-local node_tiles = minetest.settings:get_bool("wieldview_node_tiles")
-if not node_tiles then
-	node_tiles = false
-	minetest.settings:set("wieldview_node_tiles", "false")
-end
 
 wieldview = {
 	wielded_item = {},
 	transform = {},
 }
 
+dofile(minetest.get_modpath(minetest.get_current_modname()).."/get_texture.lua")
 dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua")
 
 wieldview.get_item_texture = function(self, item)
 	local texture = "3d_armor_trans.png"
 	if item ~= "" then
-		if minetest.registered_items[item] then
-			if minetest.registered_items[item].inventory_image ~= "" then
-				texture = minetest.registered_items[item].inventory_image
-			elseif node_tiles == true and minetest.registered_items[item].tiles
-					and type(minetest.registered_items[item].tiles[1]) == "string"
-					and minetest.registered_items[item].tiles[1] ~= "" then
-				texture = minetest.inventorycube(minetest.registered_items[item].tiles[1])
-			end
-		end
+		texture = armor.get_wield_image(item)
+
 		-- Get item image transformation, first from group, then from transform.lua
 		local transform = minetest.get_item_group(item, "wieldview_transform")
 		if transform == 0 then
@@ -54,6 +43,9 @@ wieldview.update_wielded_item = function(self, player)
 		return
 	end
 	if self.wielded_item[name] then
+		if player:get_meta():get_int("show_wielded_item") == 2 then
+			item = ""
+		end
 		if self.wielded_item[name] == item then
 			return
 		end
@@ -66,12 +58,12 @@ end
 minetest.register_on_joinplayer(function(player)
 	local name = player:get_player_name()
 	wieldview.wielded_item[name] = ""
-	minetest.after(0, function()
-		local pplayer = minetest.get_player_by_name(name)
-		if player then
+	minetest.after(0, function(pname)
+		local pplayer = minetest.get_player_by_name(pname)
+		if pplayer then
 			wieldview:update_wielded_item(pplayer)
 		end
-	end)
+	end, name)
 end)
 
 minetest.register_globalstep(function(dtime)

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.de.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.eo.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.es.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.fr.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.it.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.ms.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.pt.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.pt_BR.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/3d_armor.ru.tr
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/template.txt
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/shields/textures/shields_inv_shield_nether.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/shields/textures/shields_shield_nether.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/shields/textures/shields_shield_nether_preview.png

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/armor.lua
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/intllib.lua
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/es.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/fr.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/it.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/ms.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/pt.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/pt_BR.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/ru.po
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/locale/template.pot
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png
-rw-r--r--  root/root   /usr/share/games/minetest/mods/3d_armor/3d_armor/textures/preview_index.txt

No differences were encountered in the control files

More details

Full run details