Compare commits
	
		
			19 Commits
		
	
	
		
			3ca25f7ec4
			...
			player-api
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 217926da58 | ||
|  | a9b8bc4ddd | ||
|  | b6651fd396 | ||
|  | 16e2648416 | ||
|  | 44778d7861 | ||
|  | 8dcbc42525 | ||
|  | c0f303abc1 | ||
|  | 46c599333e | ||
|  | da78601a77 | ||
|  | c790b20169 | ||
|  | a897f7e72f | ||
|  | ac7615212b | ||
|  | 38fc2cff2b | ||
|  | 1dec1f2153 | ||
|  | 0dffd62fb0 | ||
|  | a0cf12bbd0 | ||
|  | 371285a903 | ||
|  | f07f0507e2 | ||
|  | e75af55f7e | 
							
								
								
									
										5
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| .* export-ignore | ||||
| gendoc.sh export-ignore | ||||
| integration-test.sh export-ignore | ||||
| preview_gen.py export-ignore | ||||
| screenshot.xcf export-ignore | ||||
							
								
								
									
										31
									
								
								.github/workflows/reference.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,31 @@ | ||||
| name: Build Reference | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|     - master | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     name: Build | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v2 | ||||
|     - name: Setup Lua | ||||
|       uses: leafo/gh-actions-lua@v8 | ||||
|       with: | ||||
|         luaVersion: 5.4 | ||||
|     - name: Setup Lua Rocks | ||||
|       uses: leafo/gh-actions-luarocks@v4 | ||||
|     - name: Setup LDoc dependencies | ||||
|       run: luarocks install --only-deps https://raw.githubusercontent.com/lunarmodules/LDoc/master/ldoc-scm-3.rockspec | ||||
|     - name: Setup LDoc | ||||
|       run: git clone --single-branch --branch=custom https://github.com/AntumDeluge/ldoc.git .ldoc/ldoc && chmod +x .ldoc/ldoc/ldoc.lua | ||||
|     - name: Generate docs | ||||
|       run: chmod +x .ldoc/gendoc.sh && ./.ldoc/gendoc.sh | ||||
|     - name: Deploy | ||||
|       uses: peaceiris/actions-gh-pages@v3 | ||||
|       with: | ||||
|         github_token: ${{ secrets.GITHUB_TOKEN }} | ||||
|         publish_dir: ./3d_armor/docs | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -4,6 +4,7 @@ | ||||
| *bak* | ||||
| tags | ||||
| *.vim | ||||
| armor.conf | ||||
|  | ||||
| ## Eclipse project files & directories | ||||
| .project | ||||
|   | ||||
							
								
								
									
										335
									
								
								.ldoc/config.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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) | ||||
							
								
								
									
										88
									
								
								.ldoc/gendoc.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -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" "crafts"; 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 ..." | ||||
| rm -vf "${d_ldoc}/"*.luadoc | ||||
|  | ||||
| # 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 "3d_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!" | ||||
							
								
								
									
										305
									
								
								.ldoc/ldoc.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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; } | ||||
|  | ||||
							
								
								
									
										46
									
								
								.ldoc/parse_crafts.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,46 @@ | ||||
| #!/usr/bin/env python | ||||
|  | ||||
| # This script will parse source files for craft recipes. | ||||
|  | ||||
| import sys, os, codecs, errno | ||||
|  | ||||
|  | ||||
| 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") | ||||
|  | ||||
| craftfile = os.path.realpath(os.path.join(d_root, "3d_armor/armor.lua")) | ||||
| if not os.path.isfile(craftfile): | ||||
| 	print("ERROR: craft file does not exist for parsing: {}".format(craftfile)) | ||||
| 	sys.exit(errnor.ENOENT) | ||||
|  | ||||
| buffer = codecs.open(craftfile, "r", "utf-8") | ||||
| if not buffer: | ||||
| 	print("ERROR: could not open file for reading: {}".format(craftfile)) | ||||
| 	sys.exit(errno.EIO) | ||||
|  | ||||
| data_in = buffer.read() | ||||
| buffer.close() | ||||
|  | ||||
| craft = "" | ||||
|  | ||||
| data_in = data_in.replace("\r\n", "\n").replace("\r", "\n") | ||||
| for sect in data_in.split("\n---"): | ||||
| 	if "@craft armor" in sect: | ||||
| 		sect = "---{}".format(sect) | ||||
| 		for li in sect.split("\n"): | ||||
| 			if li.startswith("--"): | ||||
| 				craft = "{}\n{}".format(craft, li) | ||||
|  | ||||
| outfile = os.path.join(d_ldoc, "crafting.luadoc") | ||||
|  | ||||
| buffer = codecs.open(outfile, "w", "utf-8") | ||||
| if not buffer: | ||||
| 	print("ERROR: could not open file for writing: {}".format(outfile)) | ||||
| 	sys.exit(errno.EIO) | ||||
|  | ||||
| buffer.write("\n--- 3D Armor Crafting\n--\n--  @topic crafting\n\n{}\n".format(craft)) | ||||
| buffer.close() | ||||
|  | ||||
| print("crafts exported to\t{}".format(outfile)) | ||||
							
								
								
									
										118
									
								
								.ldoc/parse_settings.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -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)) | ||||
							
								
								
									
										90
									
								
								.ldoc/parse_src.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						| @@ -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)) | ||||
| @@ -18,6 +18,7 @@ read_globals = { | ||||
|  | ||||
| 	-- deps | ||||
| 	"default", | ||||
| 	"player_api", | ||||
| 	"minetest", | ||||
| 	"unified_inventory", | ||||
| 	"wardrobe", | ||||
|   | ||||
| @@ -53,6 +53,7 @@ Change the following default settings by going to Main Menu>>Settings(Tab)>>All | ||||
|     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** | ||||
| @@ -396,6 +397,8 @@ If all of the above were made of material "wood" the player would recieve an *** | ||||
|  | ||||
| ## Armor Functions | ||||
|  | ||||
| See also: [API Reference](https://minetest-mods.github.io/3d_armor/reference/) | ||||
|  | ||||
| ### armor set_player_armor | ||||
|  | ||||
| 	armor:set_player_armor(player) | ||||
|   | ||||
							
								
								
									
										353
									
								
								3d_armor/api.lua
									
									
									
									
									
								
							
							
						
						| @@ -1,3 +1,82 @@ | ||||
|  | ||||
| --- 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\_<type>***, ***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 = minetest.get_translator(minetest.get_current_modname()) | ||||
|  | ||||
| @@ -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}, | ||||
| @@ -95,6 +177,7 @@ 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, | ||||
| @@ -103,8 +186,23 @@ armor.config = { | ||||
| 	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) | ||||
| @@ -130,6 +228,11 @@ armor.register_armor = function(self, name, def) | ||||
| 	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 | ||||
| @@ -138,38 +241,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 {} | ||||
| @@ -185,6 +342,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 | ||||
| @@ -200,6 +361,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 | ||||
| @@ -258,7 +423,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 | ||||
| @@ -358,6 +525,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 | ||||
| @@ -443,6 +617,13 @@ 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) | ||||
| @@ -461,6 +642,11 @@ 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 = {} | ||||
| @@ -477,40 +663,71 @@ armor.get_weared_armor_elements = function(self, player) | ||||
| 	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 weared_armor = self:get_weared_armor_elements(player) | ||||
|     local armor_element = self:get_element(itemstack:get_name()) | ||||
| 	if name and armor_element then | ||||
| 		if weared_armor[armor_element] ~= nil then | ||||
| 			self:unequip(player, armor_element) | ||||
| 		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 | ||||
| 		armor_inv:add_item("armor", itemstack:take_item()) | ||||
| 		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]") | ||||
| 	local weared_armor = self:get_weared_armor_elements(player) | ||||
| 	if not name or not weared_armor[armor_element] then | ||||
| 	if not name then | ||||
| 		return | ||||
| 	end | ||||
| 	local itemstack = armor_inv:remove_item("armor", ItemStack(weared_armor[armor_element])) | ||||
| 	minetest.after(0, function() | ||||
| 		local inv = player:get_inventory() | ||||
| 		if inv:room_for_item("main", itemstack) then | ||||
| 			inv:add_item("main", itemstack) | ||||
| 		else | ||||
| 			minetest.add_item(player:get_pos(), itemstack) | ||||
| 	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) | ||||
|     self:set_player_armor(player) | ||||
| 	self:save_armor_inventory(player) | ||||
| 	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 | ||||
| @@ -521,17 +738,28 @@ armor.remove_all = function(self, 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) | ||||
| @@ -542,10 +770,19 @@ armor.update_skin = function(self, name) | ||||
| 	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 | ||||
| @@ -554,6 +791,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!]" | ||||
| @@ -576,6 +819,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 | ||||
| @@ -584,6 +832,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 | ||||
| @@ -592,6 +845,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 = {} | ||||
| @@ -601,6 +859,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 | ||||
| @@ -614,6 +877,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 | ||||
| @@ -623,10 +892,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 | ||||
| @@ -635,25 +916,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 | ||||
| @@ -663,3 +957,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 | ||||
|   | ||||
| @@ -1,37 +0,0 @@ | ||||
| -- Armor Configuration (defaults) | ||||
|  | ||||
| -- Increase this if you get initialization glitches when a player first joins. | ||||
| ARMOR_INIT_DELAY = 3 | ||||
|  | ||||
| -- Number of initialization attempts. | ||||
| -- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist. | ||||
| ARMOR_INIT_TIMES = 3 | ||||
|  | ||||
| -- Increase this if armor is not getting into bones due to server lag. | ||||
| ARMOR_BONES_DELAY = 3 | ||||
|  | ||||
| -- How often player armor/wield 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: ARMOR_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 | ||||
|  | ||||
| -- You can also use this file to execute arbitary lua code | ||||
| -- eg: Dumb the armor down if using Simple Mobs | ||||
| --if minetest.get_modpath("mobs") then | ||||
| --	ARMOR_LEVEL_MULTIPLIER = 1 | ||||
| --	ARMOR_HEAL_MULTIPLIER = 0 | ||||
| --end | ||||
|  | ||||
| @@ -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) | ||||
|   | ||||
| @@ -1,6 +1,23 @@ | ||||
|  | ||||
| --- 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", | ||||
| @@ -12,6 +29,15 @@ armor:register_armor("3d_armor:helmet_admin", { | ||||
| 	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", | ||||
| @@ -23,6 +49,15 @@ armor:register_armor("3d_armor:chestplate_admin", { | ||||
| 	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", | ||||
| @@ -34,6 +69,15 @@ armor:register_armor("3d_armor:leggings_admin", { | ||||
| 	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", | ||||
| @@ -50,7 +94,28 @@ minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") | ||||
| minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") | ||||
| minetest.register_alias("adminleggings", "3d_armor:leggings_admin") | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -58,6 +123,20 @@ if armor.materials.wood then | ||||
| 		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", | ||||
| @@ -65,6 +144,20 @@ if armor.materials.wood then | ||||
| 		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", | ||||
| @@ -72,6 +165,20 @@ if armor.materials.wood then | ||||
| 		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", | ||||
| @@ -94,7 +201,27 @@ if armor.materials.wood then | ||||
| 	end | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -102,6 +229,19 @@ if armor.materials.cactus then | ||||
| 		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", | ||||
| @@ -109,6 +249,19 @@ if armor.materials.cactus then | ||||
| 		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", | ||||
| @@ -116,6 +269,19 @@ if armor.materials.cactus then | ||||
| 		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", | ||||
| @@ -138,7 +304,29 @@ if armor.materials.cactus then | ||||
| 	end | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -147,6 +335,21 @@ if armor.materials.steel then | ||||
| 		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", | ||||
| @@ -155,6 +358,21 @@ if armor.materials.steel then | ||||
| 		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", | ||||
| @@ -163,6 +381,21 @@ if armor.materials.steel then | ||||
| 		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", | ||||
| @@ -173,7 +406,29 @@ if armor.materials.steel then | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -182,6 +437,21 @@ if armor.materials.bronze then | ||||
| 		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", | ||||
| @@ -190,6 +460,21 @@ if armor.materials.bronze then | ||||
| 		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", | ||||
| @@ -198,6 +483,21 @@ if armor.materials.bronze then | ||||
| 		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", | ||||
| @@ -208,7 +508,26 @@ if armor.materials.bronze then | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -216,6 +535,18 @@ if armor.materials.diamond then | ||||
| 		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", | ||||
| @@ -223,6 +554,18 @@ if armor.materials.diamond then | ||||
| 		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", | ||||
| @@ -230,6 +573,18 @@ if armor.materials.diamond then | ||||
| 		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", | ||||
| @@ -239,7 +594,29 @@ if armor.materials.diamond then | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -248,6 +625,21 @@ if armor.materials.gold then | ||||
| 		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", | ||||
| @@ -256,6 +648,21 @@ if armor.materials.gold then | ||||
| 		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", | ||||
| @@ -264,6 +671,21 @@ if armor.materials.gold then | ||||
| 		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", | ||||
| @@ -274,38 +696,108 @@ if armor.materials.gold then | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		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=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		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=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		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=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		groups = {armor_feet=1, armor_heal=13, armor_use=66}, | ||||
| 		armor_groups = {fleshy=16}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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", | ||||
| @@ -313,6 +805,18 @@ if armor.materials.crystal then | ||||
| 		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", | ||||
| @@ -320,6 +824,18 @@ if armor.materials.crystal then | ||||
| 		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", | ||||
| @@ -327,6 +843,20 @@ if armor.materials.crystal then | ||||
| 		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", | ||||
| @@ -337,6 +867,131 @@ if armor.materials.crystal then | ||||
| 	}) | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 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}, | ||||
| 	}) | ||||
| 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 │   │ | ||||
| --  └───┴───┴───┘  └───┴───┴───┘ | ||||
|  | ||||
| for k, v in pairs(armor.materials) do | ||||
| 	minetest.register_craft({ | ||||
| 		output = "3d_armor:helmet_"..k, | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -6,3 +6,4 @@ fire? | ||||
| ethereal? | ||||
| bakedclay? | ||||
| moreores? | ||||
| nether? | ||||
|   | ||||
| @@ -96,7 +96,7 @@ 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 | ||||
| @@ -105,6 +105,9 @@ end | ||||
| if not minetest.get_modpath("ethereal") then | ||||
| 	armor.materials.crystal = nil | ||||
| end | ||||
| if not minetest.get_modpath("nether") then | ||||
| 	armor.materials.nether = nil | ||||
| end | ||||
|  | ||||
| dofile(modpath.."/armor.lua") | ||||
|  | ||||
| @@ -296,7 +299,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", | ||||
| @@ -331,6 +334,7 @@ minetest.register_on_joinplayer(function(player) | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	minetest.after(0, function() | ||||
| 		-- 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 | ||||
| @@ -501,5 +505,3 @@ if armor.config.fire_protect == true then | ||||
| 		return hp_change | ||||
| 	end, true) | ||||
| end | ||||
|  | ||||
| minetest.log("action", "[3d_armor] loaded.") | ||||
|   | ||||
							
								
								
									
										62
									
								
								3d_armor/locale/3d_armor.de.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,62 @@ | ||||
| # 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 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Adminstiefel | ||||
| Admin Chestplate=Adminbrustplatte | ||||
| Admin Helmet=Adminhelm | ||||
| Admin Leggings=Adminhose | ||||
| Bronze Boots=Bronzestiefel | ||||
| Bronze Chestplate=Bronzebrustplatte | ||||
| Bronze Helmet=Bronzehelm | ||||
| Bronze Leggings=Bronzehose | ||||
| Cactus Boots=Kaktusstiefel | ||||
| Cactus Chestplate=Kaktusbrustplatte | ||||
| Cactus Helmet=Kaktushelm | ||||
| Cactus Leggings=Kaktushose | ||||
| Crystal Boots=Kristallstiefel | ||||
| Crystal Chestplate=Kristallbrustplatte | ||||
| Crystal Helmet=Kristallhelm | ||||
| Crystal Leggings=Kristallhose | ||||
| Nether Boots=Netherstiefel | ||||
| Nether Chestplate=Netherbrustplatte | ||||
| Nether Helmet=Netherhelm | ||||
| Nether Leggings=Netherhose | ||||
| Diamond Boots=Diamantstiefel | ||||
| Diamond Chestplate=Diamantbrustplatte | ||||
| Diamond Helmet=Diamanthelm | ||||
| Diamond Leggings=Diamanthose | ||||
| Gold Boots=Goldstiefel | ||||
| Gold Chestplate=Goldbrustplatte | ||||
| Gold Helmet=Goldhelm | ||||
| Gold Leggings=Goldhose | ||||
| Mithril Boots=Mithrilstiefel | ||||
| Mithril Chestplate=Mithrilbrustplatte | ||||
| Mithril Helmet=Mithrilhelm | ||||
| Mithril Leggings=Mithrilhose | ||||
| Steel Boots=Stahlstiefel | ||||
| Steel Chestplate=Stahlbrustplatte | ||||
| Steel Helmet=Stahlhelm | ||||
| Steel Leggings=Stahlhose | ||||
| Wood Boots=Holzstiefel | ||||
| Wood Chestplate=Holzbrustplatte | ||||
| Wood Helmet=Holzhelm | ||||
| Wood Leggings=Holzhose | ||||
|  | ||||
| ### 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 | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=Botas de cristal | ||||
| Crystal Chestplate=Peto de cristal | ||||
| Crystal Helmet=Casco de cristal | ||||
| Crystal Leggings=Grebas de cristal | ||||
| Nether Boots=Botas de nether | ||||
| Nether Chestplate=Peto de nether | ||||
| Nether Helmet=Casco de nether | ||||
| Nether Leggings=Grebas de nether | ||||
| Diamond Boots=Botas de diamante | ||||
| Diamond Chestplate=Peto de diamante | ||||
| Diamond Helmet=Casco de diamante | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=Bottes en cristal | ||||
| Crystal Chestplate=Cuirasse en cristal | ||||
| Crystal Helmet=Casque en cristal | ||||
| Crystal Leggings=Jambières en cristal | ||||
| Nether Boots=Bottes en nether | ||||
| Nether Chestplate=Cuirasse en nether | ||||
| Nether Helmet=Casque en nether | ||||
| Nether Leggings=Jambières en nether | ||||
| Diamond Boots=Bottes en diamant | ||||
| Diamond Chestplate=Cuirasse en diamant | ||||
| Diamond Helmet=Casque en diamant | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=Stivali di cristallo | ||||
| Crystal Chestplate=Corazza di cristallo | ||||
| Crystal Helmet=Elmo di cristallo | ||||
| Crystal Leggings=Gambali di cristallo | ||||
| Nether Boots=Stivali di nether | ||||
| Nether Chestplate=Corazza di nether | ||||
| Nether Helmet=Elmo di nether | ||||
| Nether Leggings=Gambali di nether | ||||
| Diamond Boots=Stivali di diamante | ||||
| Diamond Chestplate=Corazza di diamante | ||||
| Diamond Helmet=Elmo di diamante | ||||
| @@ -83,3 +87,4 @@ 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 | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=But Kristal | ||||
| Crystal Chestplate=Perisai Dada Kristal | ||||
| Crystal Helmet=Helmet Kristal | ||||
| Crystal Leggings=Perisai Kaki Kristal | ||||
| Nether Boots=But Nether | ||||
| Nether Chestplate=Perisai Dada Nether | ||||
| Nether Helmet=Helmet Nether | ||||
| Nether Leggings=Perisai Kaki Nether | ||||
| Diamond Boots=But Intan | ||||
| Diamond Chestplate=Perisai Dada Intan | ||||
| Diamond Helmet=Helmet Intan | ||||
| @@ -83,3 +87,4 @@ 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 | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=Botas de Cristal | ||||
| Crystal Chestplate=Peitoral de Cristal | ||||
| Crystal Helmet=Capacete de Cristal | ||||
| Crystal Leggings=Calças de Cristal | ||||
| Nether Boots=Botas de Nether | ||||
| Nether Chestplate=Peitoral de Nether | ||||
| Nether Helmet=Capacete de Nether | ||||
| Nether Leggings=Calças de Nether | ||||
| Diamond Boots=Botas de Diamante | ||||
| Diamond Chestplate=Peitoral de Diamante | ||||
| Diamond Helmet=Capacete de Diamante | ||||
| @@ -83,3 +87,4 @@ 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 | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots=Botas de Cristal | ||||
| Crystal Chestplate=Peitoral de Cristal | ||||
| Crystal Helmet=Capacete de Cristal | ||||
| Crystal Leggings=Calças de Cristal | ||||
| Nether Boots=Botas de Nether | ||||
| Nether Chestplate=Peitoral de Nether | ||||
| Nether Helmet=Capacete de Nether | ||||
| Nether Leggings=Calças de Nether | ||||
| Diamond Boots=Botas de Diamante | ||||
| Diamond Chestplate=Peitoral de Diamante | ||||
| Diamond Helmet=Capacete de Diamante | ||||
| @@ -83,3 +87,4 @@ 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 | ||||
|   | ||||
| @@ -25,6 +25,10 @@ Crystal Boots= | ||||
| Crystal Chestplate= | ||||
| Crystal Helmet= | ||||
| Crystal Leggings= | ||||
| Nether Boots= | ||||
| Nether Chestplate= | ||||
| Nether Helmet= | ||||
| Nether Leggings= | ||||
| Diamond Boots= | ||||
| Diamond Chestplate= | ||||
| Diamond Helmet= | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| name = 3d_armor | ||||
| depends = default | ||||
| optional_depends = player_monoids, armor_monoid, pova, fire, ethereal, bakedclay, moreores | ||||
| 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. | ||||
|   | ||||
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 258 B | 
| Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 937 B After Width: | Height: | Size: 253 B | 
| Before Width: | Height: | Size: 602 B After Width: | Height: | Size: 241 B | 
| Before Width: | Height: | Size: 903 B After Width: | Height: | Size: 252 B | 
| Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 239 B | 
| Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 258 B | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 265 B | 
| Before Width: | Height: | Size: 872 B After Width: | Height: | Size: 270 B | 
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 245 B | 
| Before Width: | Height: | Size: 779 B After Width: | Height: | Size: 226 B | 
| Before Width: | Height: | Size: 854 B After Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 530 B After Width: | Height: | Size: 272 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_boots_nether.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 324 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_boots_nether_preview.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 264 B | 
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 233 B | 
| Before Width: | Height: | Size: 783 B After Width: | Height: | Size: 232 B | 
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 267 B | 
| Before Width: | Height: | Size: 501 B After Width: | Height: | Size: 233 B | 
| Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 409 B | 
| Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 285 B | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 396 B | 
| Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 282 B | 
| Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 393 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 286 B | 
| Before Width: | Height: | Size: 613 B After Width: | Height: | Size: 404 B | 
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 289 B | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 429 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 290 B | 
| Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 402 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 281 B | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 416 B | 
| Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 286 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_chestplate_nether.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 581 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_chestplate_nether_preview.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 384 B | 
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 385 B | 
| Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 274 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 324 B | 
| Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 275 B | 
| Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 348 B | 
| Before Width: | Height: | Size: 869 B After Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 337 B | 
| Before Width: | Height: | Size: 796 B After Width: | Height: | Size: 271 B | 
| Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 325 B | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 203 B | 
| Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 350 B | 
| Before Width: | Height: | Size: 834 B After Width: | Height: | Size: 257 B | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 353 B | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 269 B | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 353 B | 
| Before Width: | Height: | Size: 586 B After Width: | Height: | Size: 251 B | 
| Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 338 B | 
| Before Width: | Height: | Size: 732 B After Width: | Height: | Size: 253 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_helmet_nether.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 525 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_helmet_nether_preview.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 267 B | 
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 354 B | 
| Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 267 B | 
| Before Width: | Height: | Size: 932 B After Width: | Height: | Size: 327 B | 
| Before Width: | Height: | Size: 471 B After Width: | Height: | Size: 237 B | 
| Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 216 B | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 207 B | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 194 B | 
| Before Width: | Height: | Size: 129 B After Width: | Height: | Size: 217 B | 
| Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 220 B | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 202 B | 
| Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 224 B | 
							
								
								
									
										
											BIN
										
									
								
								3d_armor/textures/3d_armor_inv_boots_nether.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 322 B | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 209 B | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 215 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 256 B | 
| Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 261 B | 
| Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 246 B |