Compare commits
	
		
			39 Commits
		
	
	
		
			3ca25f7ec4
			...
			armor-dama
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | fed2087238 | ||
|  | dfa19cce98 | ||
|  | 1d8509e75b | ||
|  | 053c30b8b1 | ||
|  | dc7fbce09a | ||
|  | 72970b3da1 | ||
|  | 52f0e6a0ed | ||
|  | 400745dd0c | ||
|  | 68d724176e | ||
|  | 2ef66d3132 | ||
|  | e75c0bedcc | ||
|  | 92d036c5a7 | ||
|  | 7f20e5dcb7 | ||
|  | 04b45deec8 | ||
|  | bfa3a2b6d1 | ||
|  | 41301a4663 | ||
|  | eebee34fa0 | ||
|  | c7ee559a4c | ||
|  | 9444afd722 | ||
|  | e1a262ba20 | ||
|  | ac445a6cd0 | ||
|  | 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@v3 | ||||
|     - name: Setup Lua | ||||
|       uses: leafo/gh-actions-lua@v10.0.0 | ||||
|       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/rockspecs/ldoc-1.5.0-1.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) | ||||
							
								
								
									
										39
									
								
								.ldoc/crafting.luadoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | ||||
|  | ||||
| --- 3D Armor Crafting | ||||
| -- | ||||
| --  @topic crafting | ||||
|  | ||||
|  | ||||
| --- Craft recipes for helmets, chestplates, leggings, boots, & shields. | ||||
| -- | ||||
| --  @craft armor | ||||
| --  @usage | ||||
| --  Key: | ||||
| --  - m: material | ||||
| --    - wood:    group:wood | ||||
| --    - cactus:  default:cactus | ||||
| --    - steel:   default:steel_ingot | ||||
| --    - bronze:  default:bronze_ingot | ||||
| --    - diamond: default:diamond | ||||
| --    - gold:    default:gold_ingot | ||||
| --    - mithril: moreores:mithril_ingot | ||||
| --    - crystal: ethereal:crystal_ingot | ||||
| --    - nether:  nether:nether_ingot | ||||
| -- | ||||
| --  helmet:        chestplate:    leggings: | ||||
| --  ┌───┬───┬───┐  ┌───┬───┬───┐  ┌───┬───┬───┐ | ||||
| --  │ m │ m │ m │  │ m │   │ m │  │ m │ m │ m │ | ||||
| --  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤ | ||||
| --  │ m │   │ m │  │ m │ m │ m │  │ m │   │ m │ | ||||
| --  ├───┼───┼───┤  ├───┼───┼───┤  ├───┼───┼───┤ | ||||
| --  │   │   │   │  │ m │ m │ m │  │ m │   │ m │ | ||||
| --  └───┴───┴───┘  └───┴───┴───┘  └───┴───┴───┘ | ||||
| -- | ||||
| --  boots:         shield: | ||||
| --  ┌───┬───┬───┐  ┌───┬───┬───┐ | ||||
| --  │   │   │   │  │ m │ m │ m │ | ||||
| --  ├───┼───┼───┤  ├───┼───┼───┤ | ||||
| --  │ m │   │ m │  │ m │ m │ m │ | ||||
| --  ├───┼───┼───┤  ├───┼───┼───┤ | ||||
| --  │ m │   │ m │  │   │ m │   │ | ||||
| --  └───┴───┴───┘  └───┴───┴───┘ | ||||
							
								
								
									
										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; do | ||||
| 	script="${d_ldoc}/parse_${script}.py" | ||||
| 	if test ! -f "${script}"; then | ||||
| 		echo "ERROR: script doesn't exist: ${script}" | ||||
| 	else | ||||
| 		# check script's executable bit | ||||
| 		if test ! -x "${script}"; then | ||||
| 			chmod +x "${script}" | ||||
| 		fi | ||||
| 		# execute script | ||||
| 		"${script}" | ||||
| 	fi | ||||
| done | ||||
|  | ||||
| echo | ||||
|  | ||||
| # generate new doc files | ||||
| "${cmd_ldoc}" --UNSAFE_NO_SANDBOX -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? | ||||
|  | ||||
| # check exit status | ||||
| if test ${retval} -ne 0; then | ||||
| 	echo -e "\nan error occurred (ldoc return code: ${retval})" | ||||
| 	exit ${retval} | ||||
| fi | ||||
|  | ||||
| echo -e "\ncleaning temp files ..." | ||||
| find "${d_ldoc}" -type f -name "*.luadoc" ! -name "crafting.luadoc" -exec rm -vf {} + | ||||
|  | ||||
| # HACK: ldoc does not seem to like the "shields:" prefix | ||||
| echo -e "\ncompensating for LDoc's issue with \"shields:\" prefix ..." | ||||
| sed -i \ | ||||
| 	-e 's/<strong>shield_/<strong>shields:shield_/' \ | ||||
| 	-e 's/<td class="name\(.*\)>shield_/<td class="name\1>shields:shield_/' \ | ||||
| 	-e 's/<a href="#shield_/<a href="#shields:shield_/' \ | ||||
| 	-e 's/<a name.*"shield_/<a name="shields:shield_/' \ | ||||
| 	"${d_export}/topics/shields.html" | ||||
|  | ||||
| # copy textures to data directory | ||||
| printf "\ncopying textures ..." | ||||
| mkdir -p "${d_data}" | ||||
| texture_count=0 | ||||
| for d_mod in armor_* shields; do | ||||
| 	printf "\rcopying textures from ${d_mod} ...\n" | ||||
| 	for png in $(find "${d_root}/${d_mod}/textures" -maxdepth 1 -type f -name "*.png"); do | ||||
| 		if test -f "${d_data}/$(basename ${png})"; then | ||||
| 			echo "WARNING: not overwriting existing file: ${png}" | ||||
| 		else | ||||
| 			cp "${png}" "${d_data}" | ||||
| 			texture_count=$((texture_count + 1)) | ||||
| 			printf "\rcopied ${texture_count} textures" | ||||
| 		fi | ||||
| 	done | ||||
| done | ||||
|  | ||||
| echo -e "\n\nDone!" | ||||
							
								
								
									
										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; } | ||||
|  | ||||
							
								
								
									
										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** | ||||
| @@ -253,7 +254,7 @@ The above allows armor to block/prevent new damage types but you also need to as | ||||
| ## Groups used by 3d_Armor | ||||
| 3d_armor has many default groups already registered, these are categorized under 4 main headings | ||||
|  - **Elements:** armor_head, armor_torso, armor_legs, armor_feet | ||||
|  - **Attributes:** armor_heal, armor_fire, armor_water | ||||
|  - **Attributes:** armor_heal, armor_fire, armor_water, armor_feather | ||||
|  - **Physics:** physics_jump, physics_speed, physics_gravity | ||||
|  - **Durability:** armor_use, flammable | ||||
|   | ||||
| @@ -333,6 +334,9 @@ The below Diamond chestplate has a 12% chance to completely block all damage (ar | ||||
| 		damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, | ||||
| 	}) | ||||
|  | ||||
| #### Armor_feather | ||||
| ***"Armor_feather"*** will slow a player when falling. This only has one level or state, which is armor_feather=1 | ||||
|  | ||||
| ### Physics | ||||
| The physics attributes supported by 3d_armor are ***physics_jump, physics_speed and physics_gravity***. Although 3d_armor supports the use of this with no other mods it is recommended that the mod [player_monoids](https://forum.minetest.net/viewtopic.php?t=14895) is used to help with intermod compatability.  | ||||
|  | ||||
| @@ -396,6 +400,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) | ||||
|   | ||||
							
								
								
									
										372
									
								
								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()) | ||||
|  | ||||
| @@ -33,7 +112,7 @@ armor = { | ||||
| 	timer = 0, | ||||
| 	elements = {"head", "torso", "legs", "feet"}, | ||||
| 	physics = {"jump", "speed", "gravity"}, | ||||
| 	attributes = {"heal", "fire", "water"}, | ||||
| 	attributes = {"heal", "fire", "water", "feather"}, | ||||
| 	formspec = "image[2.5,0;2,4;armor_preview]".. | ||||
| 		default.gui_bg.. | ||||
| 		default.gui_bg_img.. | ||||
| @@ -53,14 +132,17 @@ armor = { | ||||
| 		gold = "default:gold_ingot", | ||||
| 		mithril = "moreores:mithril_ingot", | ||||
| 		crystal = "ethereal:crystal_ingot", | ||||
| 		nether = "nether:nether_ingot", | ||||
| 	}, | ||||
| 	fire_nodes = { | ||||
| 		{"nether:lava_source",      5, 8}, | ||||
| 		{"default:lava_source",     5, 8}, | ||||
| 		{"default:lava_flowing",    5, 8}, | ||||
| 		{"fire:basic_flame",        3, 4}, | ||||
| 		{"fire:permanent_flame",    3, 4}, | ||||
| 		{"ethereal:crystal_spike",  2, 1}, | ||||
| 		{"ethereal:fire_flower",    2, 1}, | ||||
| 		{"nether:lava_crust",       2, 1}, | ||||
| 		{"default:torch",           1, 1}, | ||||
| 		{"default:torch_ceiling",   1, 1}, | ||||
| 		{"default:torch_wall",      1, 1}, | ||||
| @@ -95,16 +177,33 @@ armor.config = { | ||||
| 	material_gold = true, | ||||
| 	material_mithril = true, | ||||
| 	material_crystal = true, | ||||
| 	material_nether = true, | ||||
| 	set_elements = "head torso legs feet shield", | ||||
| 	set_multiplier = 1.1, | ||||
| 	water_protect = true, | ||||
| 	fire_protect = minetest.get_modpath("ethereal") ~= nil, | ||||
| 	fire_protect_torch = minetest.get_modpath("ethereal") ~= nil, | ||||
| 	feather_fall = true, | ||||
| 	punch_damage = true, | ||||
| } | ||||
|  | ||||
| -- Armor Registration | ||||
|  | ||||
| --- Methods | ||||
| -- | ||||
| --  @section methods | ||||
|  | ||||
| --- Registers a new armor item. | ||||
| -- | ||||
| --  @function armor:register_armor | ||||
| --  @tparam string name Armor item technical name (ex: "3d\_armor:helmet\_gold"). | ||||
| --  @tparam ArmorDef def Armor definition table. | ||||
| --  @usage armor:register_armor("3d_armor:helmet_wood", { | ||||
| --    description = "Wood Helmet", | ||||
| --    inventory_image = "3d_armor_inv_helmet_wood.png", | ||||
| --    groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, | ||||
| --    armor_groups = {fleshy=5}, | ||||
| --    damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, | ||||
| --  }) | ||||
| armor.register_armor = function(self, name, def) | ||||
| 	def.on_secondary_use = function(itemstack, player) | ||||
| 		return armor:equip(player, itemstack) | ||||
| @@ -130,6 +229,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 +242,92 @@ armor.register_armor_group = function(self, group, base) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- Armor callbacks | ||||
| --- Armor Callbacks Registration | ||||
| -- | ||||
| --  @section callbacks | ||||
|  | ||||
| --- Registers a callback for when player visuals are update. | ||||
| -- | ||||
| --  @function armor:register_on_update | ||||
| --  @tparam function func Function to be executed. | ||||
| --  @see armor:update_player_visuals | ||||
| --  @usage armor:register_on_update(function(player, index, stack) | ||||
| --    -- code to execute | ||||
| --  end) | ||||
| armor.register_on_update = function(self, func) | ||||
| 	if type(func) == "function" then | ||||
| 		table.insert(self.registered_callbacks.on_update, func) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- Registers a callback for when armor is equipped. | ||||
| -- | ||||
| --  @function armor:register_on_equip | ||||
| --  @tparam function func Function to be executed. | ||||
| --  @usage armor:register_on_equip(function(player, index, stack) | ||||
| --    -- code to execute | ||||
| --  end) | ||||
| armor.register_on_equip = function(self, func) | ||||
| 	if type(func) == "function" then | ||||
| 		table.insert(self.registered_callbacks.on_equip, func) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- Registers a callback for when armor is unequipped. | ||||
| -- | ||||
| --  @function armor:register_on_unequip | ||||
| --  @tparam function func Function to be executed. | ||||
| --  @usage armor:register_on_unequip(function(player, index, stack) | ||||
| --    -- code to execute | ||||
| --  end) | ||||
| armor.register_on_unequip = function(self, func) | ||||
| 	if type(func) == "function" then | ||||
| 		table.insert(self.registered_callbacks.on_unequip, func) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- Registers a callback for when armor is damaged. | ||||
| -- | ||||
| --  @function armor:register_on_damage | ||||
| --  @tparam function func Function to be executed. | ||||
| --  @see armor:damage | ||||
| --  @usage armor:register_on_damage(function(player, index, stack) | ||||
| --    -- code to execute | ||||
| --  end) | ||||
| armor.register_on_damage = function(self, func) | ||||
| 	if type(func) == "function" then | ||||
| 		table.insert(self.registered_callbacks.on_damage, func) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- Registers a callback for when armor is destroyed. | ||||
| -- | ||||
| --  @function armor:register_on_destroy | ||||
| --  @tparam function func Function to be executed. | ||||
| --  @see armor:damage | ||||
| --  @usage armor:register_on_destroy(function(player, index, stack) | ||||
| --    -- code to execute | ||||
| --  end) | ||||
| armor.register_on_destroy = function(self, func) | ||||
| 	if type(func) == "function" then | ||||
| 		table.insert(self.registered_callbacks.on_destroy, func) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- @section end | ||||
|  | ||||
|  | ||||
| --- Methods | ||||
| -- | ||||
| --  @section methods | ||||
|  | ||||
| --- Runs callbacks. | ||||
| -- | ||||
| --  @function armor:run_callbacks | ||||
| --  @tparam function callback Function to execute. | ||||
| --  @tparam ObjectRef player First parameter passed to callback. | ||||
| --  @tparam int index Second parameter passed to callback. | ||||
| --  @tparam ItemStack stack Callback owner. | ||||
| armor.run_callbacks = function(self, callback, player, index, stack) | ||||
| 	if stack then | ||||
| 		local def = stack:get_definition() or {} | ||||
| @@ -185,6 +343,10 @@ armor.run_callbacks = function(self, callback, player, index, stack) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| --- Updates visuals. | ||||
| -- | ||||
| --  @function armor:update_player_visuals | ||||
| --  @tparam ObjectRef player | ||||
| armor.update_player_visuals = function(self, player) | ||||
| 	if not player then | ||||
| 		return | ||||
| @@ -200,6 +362,10 @@ armor.update_player_visuals = function(self, player) | ||||
| 	self:run_callbacks("on_update", player) | ||||
| end | ||||
|  | ||||
| --- Sets player's armor attributes. | ||||
| -- | ||||
| --  @function armor:set_player_armor | ||||
| --  @tparam ObjectRef player | ||||
| armor.set_player_armor = function(self, player) | ||||
| 	local name, armor_inv = self:get_valid_player(player, "[set_player_armor]") | ||||
| 	if not name then | ||||
| @@ -258,7 +424,9 @@ armor.set_player_armor = function(self, player) | ||||
| 			tex = tex:gsub(".png$", "") | ||||
| 			local prev = def.preview or tex.."_preview" | ||||
| 			prev = prev:gsub(".png$", "") | ||||
| 			texture = texture.."^"..tex..".png" | ||||
| 			if not transparent_armor then | ||||
| 				texture = texture.."^"..tex..".png" | ||||
| 			end | ||||
| 			preview = preview.."^"..prev..".png" | ||||
| 			state = state + stack:get_wear() | ||||
| 			count = count + 1 | ||||
| @@ -323,10 +491,13 @@ armor.set_player_armor = function(self, player) | ||||
| 		armor_monoid.monoid:add_change(player, change, "3d_armor:armor") | ||||
| 	else | ||||
| 		-- Preserve immortal group (damage disabled for player) | ||||
| 		local immortal = player:get_armor_groups().immortal | ||||
| 		local player_groups = player:get_armor_groups() | ||||
| 		local immortal = player_groups.immortal | ||||
| 		if immortal and immortal ~= 0 then | ||||
| 			groups.immortal = 1 | ||||
| 		end | ||||
| 		-- Preserve fall_damage_add_percent group (fall damage modifier) | ||||
| 		groups.fall_damage_add_percent = player_groups.fall_damage_add_percent | ||||
| 		player:set_armor_groups(groups) | ||||
| 	end | ||||
| 	if use_player_monoids then | ||||
| @@ -358,6 +529,13 @@ armor.set_player_armor = function(self, player) | ||||
| 	self:update_player_visuals(player) | ||||
| end | ||||
|  | ||||
| --- Action when armor is punched. | ||||
| -- | ||||
| --  @function armor:punch | ||||
| --  @tparam ObjectRef player Player wearing the armor. | ||||
| --  @tparam ObjectRef hitter Entity attacking player. | ||||
| --  @tparam[opt] int time_from_last_punch Time in seconds since last punch action. | ||||
| --  @tparam[opt] table tool_capabilities See `entity_damage_mechanism`. | ||||
| armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities) | ||||
| 	local name, armor_inv = self:get_valid_player(player, "[punch]") | ||||
| 	if not name then | ||||
| @@ -443,9 +621,19 @@ 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) | ||||
| 	if not worn_armor then | ||||
| 		return | ||||
| 	end | ||||
| 	local armor_worn_cnt = 0 | ||||
| 	for k,v in pairs(worn_armor) do | ||||
| 		armor_worn_cnt = armor_worn_cnt + 1 | ||||
| @@ -461,6 +649,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 +670,75 @@ 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 | ||||
| 				--prevents equiping an armor that would unequip a cursed armor. | ||||
| 				if minetest.get_item_group(stack:get_name(), "cursed") ~= 0 then | ||||
| 					return itemstack | ||||
| 				end | ||||
| 				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 +749,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 +781,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 +802,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 +830,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 +843,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 +856,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 +870,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 +888,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 +903,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 +927,42 @@ 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 | ||||
| 	if type(player) ~= "userdata" then | ||||
| 		-- Fake player, fail silently | ||||
| 		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 +972,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,372 +0,0 @@ | ||||
| -- support for i18n | ||||
| local S = armor.get_translator | ||||
|  | ||||
| armor:register_armor("3d_armor:helmet_admin", { | ||||
| 	description = S("Admin Helmet"), | ||||
| 	inventory_image = "3d_armor_inv_helmet_admin.png", | ||||
| 	armor_groups = {fleshy=100}, | ||||
| 	groups = {armor_head=1, armor_heal=100, armor_use=0, armor_water=1, | ||||
| 			not_in_creative_inventory=1}, | ||||
| 	on_drop = function(itemstack, dropper, pos) | ||||
| 		return | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| armor:register_armor("3d_armor:chestplate_admin", { | ||||
| 	description = S("Admin Chestplate"), | ||||
| 	inventory_image = "3d_armor_inv_chestplate_admin.png", | ||||
| 	armor_groups = {fleshy=100}, | ||||
| 	groups = {armor_torso=1, armor_heal=100, armor_use=0, | ||||
| 			not_in_creative_inventory=1}, | ||||
| 	on_drop = function(itemstack, dropper, pos) | ||||
| 		return | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| armor:register_armor("3d_armor:leggings_admin", { | ||||
| 	description = S("Admin Leggings"), | ||||
| 	inventory_image = "3d_armor_inv_leggings_admin.png", | ||||
| 	armor_groups = {fleshy=100}, | ||||
| 	groups = {armor_legs=1, armor_heal=100, armor_use=0, | ||||
| 			not_in_creative_inventory=1}, | ||||
| 	on_drop = function(itemstack, dropper, pos) | ||||
| 		return | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| armor:register_armor("3d_armor:boots_admin", { | ||||
| 	description = S("Admin Boots"), | ||||
| 	inventory_image = "3d_armor_inv_boots_admin.png", | ||||
| 	armor_groups = {fleshy=100}, | ||||
| 	groups = {armor_feet=1, armor_heal=100, armor_use=0, | ||||
| 			not_in_creative_inventory=1}, | ||||
| 	on_drop = function(itemstack, dropper, pos) | ||||
| 		return | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| minetest.register_alias("adminboots", "3d_armor:boots_admin") | ||||
| minetest.register_alias("adminhelmet", "3d_armor:helmet_admin") | ||||
| minetest.register_alias("adminchestplate", "3d_armor:chestplate_admin") | ||||
| minetest.register_alias("adminleggings", "3d_armor:leggings_admin") | ||||
|  | ||||
| if armor.materials.wood then | ||||
| 	armor:register_armor("3d_armor:helmet_wood", { | ||||
| 		description = S("Wood Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_wood.png", | ||||
| 		groups = {armor_head=1, armor_heal=0, armor_use=2000, flammable=1}, | ||||
| 		armor_groups = {fleshy=5}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_wood", { | ||||
| 		description = S("Wood Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_wood.png", | ||||
| 		groups = {armor_torso=1, armor_heal=0, armor_use=2000, flammable=1}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_wood", { | ||||
| 		description = S("Wood Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_wood.png", | ||||
| 		groups = {armor_legs=1, armor_heal=0, armor_use=2000, flammable=1}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_wood", { | ||||
| 		description = S("Wood Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_wood.png", | ||||
| 		armor_groups = {fleshy=5}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1}, | ||||
| 		groups = {armor_feet=1, armor_heal=0, armor_use=2000, flammable=1}, | ||||
| 	}) | ||||
| 	local wood_armor_fuel = { | ||||
| 		helmet = 6, | ||||
| 		chestplate = 8, | ||||
| 		leggings = 7, | ||||
| 		boots = 5 | ||||
| 	} | ||||
| 	for armor, burn in pairs(wood_armor_fuel) do | ||||
| 		minetest.register_craft({ | ||||
| 			type = "fuel", | ||||
| 			recipe = "3d_armor:" .. armor .. "_wood", | ||||
| 			burntime = burn, | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| if armor.materials.cactus then | ||||
| 	armor:register_armor("3d_armor:helmet_cactus", { | ||||
| 		description = S("Cactus Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_cactus.png", | ||||
| 		groups = {armor_head=1, armor_heal=0, armor_use=1000}, | ||||
| 		armor_groups = {fleshy=5}, | ||||
| 		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_cactus", { | ||||
| 		description = S("Cactus Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_cactus.png", | ||||
| 		groups = {armor_torso=1, armor_heal=0, armor_use=1000}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_cactus", { | ||||
| 		description = S("Cactus Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_cactus.png", | ||||
| 		groups = {armor_legs=1, armor_heal=0, armor_use=1000}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_cactus", { | ||||
| 		description = S("Cactus Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_cactus.png", | ||||
| 		groups = {armor_feet=1, armor_heal=0, armor_use=1000}, | ||||
| 		armor_groups = {fleshy=5}, | ||||
| 		damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1}, | ||||
| 	}) | ||||
| 	local cactus_armor_fuel = { | ||||
| 		helmet = 14, | ||||
| 		chestplate = 16, | ||||
| 		leggings = 15, | ||||
| 		boots = 13 | ||||
| 	} | ||||
| 	for armor, burn in pairs(cactus_armor_fuel) do | ||||
| 		minetest.register_craft({ | ||||
| 			type = "fuel", | ||||
| 			recipe = "3d_armor:" .. armor .. "_cactus", | ||||
| 			burntime = burn, | ||||
| 		}) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| if armor.materials.steel then | ||||
| 	armor:register_armor("3d_armor:helmet_steel", { | ||||
| 		description = S("Steel Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_steel.png", | ||||
| 		groups = {armor_head=1, armor_heal=0, armor_use=800, | ||||
| 			physics_speed=-0.01, physics_gravity=0.01}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_steel", { | ||||
| 		description = S("Steel Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_steel.png", | ||||
| 		groups = {armor_torso=1, armor_heal=0, armor_use=800, | ||||
| 			physics_speed=-0.04, physics_gravity=0.04}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_steel", { | ||||
| 		description = S("Steel Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_steel.png", | ||||
| 		groups = {armor_legs=1, armor_heal=0, armor_use=800, | ||||
| 			physics_speed=-0.03, physics_gravity=0.03}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_steel", { | ||||
| 		description = S("Steel Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_steel.png", | ||||
| 		groups = {armor_feet=1, armor_heal=0, armor_use=800, | ||||
| 			physics_speed=-0.01, physics_gravity=0.01}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| if armor.materials.bronze then | ||||
| 	armor:register_armor("3d_armor:helmet_bronze", { | ||||
| 		description = S("Bronze Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_bronze.png", | ||||
| 		groups = {armor_head=1, armor_heal=6, armor_use=400, | ||||
| 			physics_speed=-0.01, physics_gravity=0.01}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_bronze", { | ||||
| 		description = S("Bronze Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_bronze.png", | ||||
| 		groups = {armor_torso=1, armor_heal=6, armor_use=400, | ||||
| 			physics_speed=-0.04, physics_gravity=0.04}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_bronze", { | ||||
| 		description = S("Bronze Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_bronze.png", | ||||
| 		groups = {armor_legs=1, armor_heal=6, armor_use=400, | ||||
| 			physics_speed=-0.03, physics_gravity=0.03}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_bronze", { | ||||
| 		description = S("Bronze Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_bronze.png", | ||||
| 		groups = {armor_feet=1, armor_heal=6, armor_use=400, | ||||
| 			physics_speed=-0.01, physics_gravity=0.01}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| if armor.materials.diamond then | ||||
| 	armor:register_armor("3d_armor:helmet_diamond", { | ||||
| 		description = S("Diamond Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_diamond.png", | ||||
| 		groups = {armor_head=1, armor_heal=12, armor_use=200}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_diamond", { | ||||
| 		description = S("Diamond Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_diamond.png", | ||||
| 		groups = {armor_torso=1, armor_heal=12, armor_use=200}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_diamond", { | ||||
| 		description = S("Diamond Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_diamond.png", | ||||
| 		groups = {armor_legs=1, armor_heal=12, armor_use=200}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_diamond", { | ||||
| 		description = S("Diamond Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_diamond.png", | ||||
| 		groups = {armor_feet=1, armor_heal=12, armor_use=200}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, choppy=1, level=3}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| if armor.materials.gold then | ||||
| 	armor:register_armor("3d_armor:helmet_gold", { | ||||
| 		description = S("Gold Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_gold.png", | ||||
| 		groups = {armor_head=1, armor_heal=6, armor_use=300, | ||||
| 			physics_speed=-0.02, physics_gravity=0.02}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_gold", { | ||||
| 		description = S("Gold Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_gold.png", | ||||
| 		groups = {armor_torso=1, armor_heal=6, armor_use=300, | ||||
| 			physics_speed=-0.05, physics_gravity=0.05}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_gold", { | ||||
| 		description = S("Gold Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_gold.png", | ||||
| 		groups = {armor_legs=1, armor_heal=6, armor_use=300, | ||||
| 			physics_speed=-0.04, physics_gravity=0.04}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_gold", { | ||||
| 		description = S("Gold Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_gold.png", | ||||
| 		groups = {armor_feet=1, armor_heal=6, armor_use=300, | ||||
| 			physics_speed=-0.02, physics_gravity=0.02}, | ||||
| 		armor_groups = {fleshy=10}, | ||||
| 		damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| if armor.materials.mithril then | ||||
| 	armor:register_armor("3d_armor:helmet_mithril", { | ||||
| 		description = S("Mithril Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_mithril.png", | ||||
| 		groups = {armor_head=1, armor_heal=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_mithril", { | ||||
| 		description = S("Mithril Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_mithril.png", | ||||
| 		groups = {armor_torso=1, armor_heal=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_mithril", { | ||||
| 		description = S("Mithril Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_mithril.png", | ||||
| 		groups = {armor_legs=1, armor_heal=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_mithril", { | ||||
| 		description = S("Mithril Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_mithril.png", | ||||
| 		groups = {armor_feet=1, armor_heal=12, armor_use=100}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| if armor.materials.crystal then | ||||
| 	armor:register_armor("3d_armor:helmet_crystal", { | ||||
| 		description = S("Crystal Helmet"), | ||||
| 		inventory_image = "3d_armor_inv_helmet_crystal.png", | ||||
| 		groups = {armor_head=1, armor_heal=12, armor_use=100, armor_fire=1}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:chestplate_crystal", { | ||||
| 		description = S("Crystal Chestplate"), | ||||
| 		inventory_image = "3d_armor_inv_chestplate_crystal.png", | ||||
| 		groups = {armor_torso=1, armor_heal=12, armor_use=100, armor_fire=1}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:leggings_crystal", { | ||||
| 		description = S("Crystal Leggings"), | ||||
| 		inventory_image = "3d_armor_inv_leggings_crystal.png", | ||||
| 		groups = {armor_legs=1, armor_heal=12, armor_use=100, armor_fire=1}, | ||||
| 		armor_groups = {fleshy=20}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| 	armor:register_armor("3d_armor:boots_crystal", { | ||||
| 		description = S("Crystal Boots"), | ||||
| 		inventory_image = "3d_armor_inv_boots_crystal.png", | ||||
| 		groups = {armor_feet=1, armor_heal=12, armor_use=100, physics_speed=1, | ||||
| 				physics_jump=0.5, armor_fire=1}, | ||||
| 		armor_groups = {fleshy=15}, | ||||
| 		damage_groups = {cracky=2, snappy=1, level=3}, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| for k, v in pairs(armor.materials) do | ||||
| 	minetest.register_craft({ | ||||
| 		output = "3d_armor:helmet_"..k, | ||||
| 		recipe = { | ||||
| 			{v, v, v}, | ||||
| 			{v, "", v}, | ||||
| 			{"", "", ""}, | ||||
| 		}, | ||||
| 	}) | ||||
| 	minetest.register_craft({ | ||||
| 		output = "3d_armor:chestplate_"..k, | ||||
| 		recipe = { | ||||
| 			{v, "", v}, | ||||
| 			{v, v, v}, | ||||
| 			{v, v, v}, | ||||
| 		}, | ||||
| 	}) | ||||
| 	minetest.register_craft({ | ||||
| 		output = "3d_armor:leggings_"..k, | ||||
| 		recipe = { | ||||
| 			{v, v, v}, | ||||
| 			{v, "", v}, | ||||
| 			{v, "", v}, | ||||
| 		}, | ||||
| 	}) | ||||
| 	minetest.register_craft({ | ||||
| 		output = "3d_armor:boots_"..k, | ||||
| 		recipe = { | ||||
| 			{v, "", v}, | ||||
| 			{v, "", v}, | ||||
| 		}, | ||||
| 	}) | ||||
| end | ||||
| @@ -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 | ||||
|   | ||||
| @@ -1,8 +0,0 @@ | ||||
| default | ||||
| player_monoids? | ||||
| armor_monoid? | ||||
| pova? | ||||
| fire? | ||||
| ethereal? | ||||
| bakedclay? | ||||
| moreores? | ||||
| @@ -1 +0,0 @@ | ||||
| Adds craftable armor that is visible to other players. | ||||
| @@ -96,17 +96,10 @@ for _, mod in pairs(skin_mods) do | ||||
| 				armor:add_preview(fn) | ||||
| 			end | ||||
| 		end | ||||
| 		armor.skin_mod = mod | ||||
| 		armor.set_skin_mod(mod) | ||||
| 	end | ||||
| end | ||||
| if not minetest.get_modpath("moreores") then | ||||
| 	armor.materials.mithril = nil | ||||
| end | ||||
| if not minetest.get_modpath("ethereal") then | ||||
| 	armor.materials.crystal = nil | ||||
| end | ||||
|  | ||||
| dofile(modpath.."/armor.lua") | ||||
|  | ||||
| -- Armor Initialization | ||||
|  | ||||
| @@ -231,6 +224,11 @@ local function init_player_armor(initplayer) | ||||
| 			if player:get_player_name() ~= name then | ||||
| 				return 0 | ||||
| 			end | ||||
| 			--cursed items cannot be unequiped by the player | ||||
| 			local is_cursed = minetest.get_item_group(stack:get_name(), "cursed") ~= 0 | ||||
| 			if not minetest.is_creative_enabled(player) and is_cursed then | ||||
| 				return 0 | ||||
| 			end | ||||
| 			return stack:get_count() | ||||
| 		end, | ||||
| 		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) | ||||
| @@ -296,7 +294,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", | ||||
| @@ -310,6 +308,10 @@ default.player_register_model("3d_armor_character.b3d", { | ||||
| 		mine = {x=189, y=198}, | ||||
| 		walk_mine = {x=200, y=219}, | ||||
| 		sit = {x=81, y=160}, | ||||
| 		-- compatibility w/ the emote mod | ||||
| 		wave = {x = 192, y = 196, override_local = true}, | ||||
| 		point = {x = 196, y = 196, override_local = true}, | ||||
| 		freeze = {x = 205, y = 205, override_local = true}, | ||||
| 	}, | ||||
| }) | ||||
|  | ||||
| @@ -331,6 +333,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 | ||||
| @@ -357,9 +360,12 @@ if armor.config.drop == true or armor.config.destroy == true then | ||||
| 		for i=1, armor_inv:get_size("armor") do | ||||
| 			local stack = armor_inv:get_stack("armor", i) | ||||
| 			if stack:get_count() > 0 then | ||||
| 				table.insert(drop, stack) | ||||
| 				armor:run_callbacks("on_unequip", player, i, stack) | ||||
| 				armor_inv:set_stack("armor", i, nil) | ||||
| 				--soulbound armors remain equipped after death | ||||
| 				if minetest.get_item_group(stack:get_name(), "soulbound") == 0 then | ||||
| 					table.insert(drop, stack) | ||||
| 					armor:run_callbacks("on_unequip", player, i, stack) | ||||
| 					armor_inv:set_stack("armor", i, nil) | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 		armor:save_armor_inventory(player) | ||||
| @@ -395,8 +401,8 @@ if armor.config.drop == true or armor.config.destroy == true then | ||||
| 			end) | ||||
| 		end | ||||
| 	end) | ||||
| else -- reset un-dropped armor and it's effects | ||||
| 	minetest.register_on_respawnplayer(function(player) | ||||
| 		-- reset un-dropped armor and it's effects | ||||
| 		armor:set_player_armor(player) | ||||
| 	end) | ||||
| end | ||||
| @@ -416,26 +422,48 @@ if armor.config.punch_damage == true then | ||||
| end | ||||
|  | ||||
| minetest.register_on_player_hpchange(function(player, hp_change, reason) | ||||
| 	if player and reason.type ~= "drown" and reason.hunger == nil | ||||
| 			and hp_change < 0 then | ||||
| 		local name = player:get_player_name() | ||||
| 		if name then | ||||
| 			local heal = armor.def[name].heal | ||||
| 			if heal >= math.random(100) then | ||||
| 				hp_change = 0 | ||||
| 			end | ||||
| 			-- check if armor damage was handled by fire or on_punchplayer | ||||
| 			local time = last_punch_time[name] or 0 | ||||
| 			if time == 0 or time + 1 < minetest.get_gametime() then | ||||
| 				armor:punch(player) | ||||
| 			end | ||||
| 	if not minetest.is_player(player) then | ||||
| 		return hp_change | ||||
| 	end | ||||
|  | ||||
| 	if reason.type == "drown" or reason.hunger or hp_change >= 0 then | ||||
| 		return hp_change | ||||
| 	end | ||||
|  | ||||
| 	local name = player:get_player_name() | ||||
| 	local properties = player:get_properties() | ||||
| 	local hp = player:get_hp() | ||||
| 	if hp + hp_change < properties.hp_max then | ||||
| 		local heal = armor.def[name].heal | ||||
| 		if heal >= math.random(100) then | ||||
| 			hp_change = 0 | ||||
| 		end | ||||
| 		-- check if armor damage was handled by fire or on_punchplayer | ||||
| 		local time = last_punch_time[name] or 0 | ||||
| 		if time == 0 or time + 1 < minetest.get_gametime() then | ||||
| 			armor:punch(player) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	return hp_change | ||||
| end, true) | ||||
|  | ||||
| minetest.register_globalstep(function(dtime) | ||||
| 	timer = timer + dtime | ||||
|  | ||||
| 	if armor.config.feather_fall == true then | ||||
| 		for _,player in pairs(minetest.get_connected_players()) do | ||||
| 			local name = player:get_player_name() | ||||
| 			if armor.def[name].feather > 0 then | ||||
| 				local vel_y = player:get_velocity().y | ||||
| 				if vel_y < 0 and vel_y < 3 then | ||||
| 					vel_y = -(vel_y * 0.05) | ||||
| 					player:add_velocity({x = 0, y = vel_y, z = 0}) | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if timer <= armor.config.init_delay then | ||||
| 		return | ||||
| 	end | ||||
| @@ -445,7 +473,7 @@ minetest.register_globalstep(function(dtime) | ||||
| 		local remove = init_player_armor(player) == true | ||||
| 		pending_players[player] = count + 1 | ||||
| 		if remove == false and count > armor.config.init_times then | ||||
| 			minetest.log("warning", S("3d_armor: Failed to initialize player")) | ||||
| 			minetest.log("warning", "3d_armor: Failed to initialize player") | ||||
| 			remove = true | ||||
| 		end | ||||
| 		if remove == true then | ||||
| @@ -465,22 +493,14 @@ minetest.register_globalstep(function(dtime) | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| -- Fire Protection, added by TenPlus1. | ||||
| if armor.config.fire_protect == true then | ||||
| 	-- override any hot nodes that do not already deal damage | ||||
| 	for _, row in pairs(armor.fire_nodes) do | ||||
| 		if minetest.registered_nodes[row[1]] then | ||||
| 			local damage = minetest.registered_nodes[row[1]].damage_per_second | ||||
| 			if not damage or damage == 0 then | ||||
| 				minetest.override_item(row[1], {damage_per_second = row[3]}) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| else | ||||
| 	print ("[3d_armor] Fire Nodes disabled") | ||||
| end | ||||
|  | ||||
| if armor.config.fire_protect == true then | ||||
| 	-- make torches hurt | ||||
| 	minetest.override_item("default:torch", {damage_per_second = 1}) | ||||
| 	minetest.override_item("default:torch_wall", {damage_per_second = 1}) | ||||
| 	minetest.override_item("default:torch_ceiling", {damage_per_second = 1}) | ||||
|  | ||||
| 	-- check player damage for any hot nodes we may be protected against | ||||
| 	minetest.register_on_player_hpchange(function(player, hp_change, reason) | ||||
|  | ||||
| 		if reason.type == "node_damage" and reason.node then | ||||
| @@ -489,9 +509,7 @@ if armor.config.fire_protect == true then | ||||
| 				local name = player:get_player_name() | ||||
| 				for _,igniter in pairs(armor.fire_nodes) do | ||||
| 					if reason.node == igniter[1] then | ||||
| 						if armor.def[name].fire < igniter[2] then | ||||
| 							armor:punch(player, "fire") | ||||
| 						else | ||||
| 						if armor.def[name].fire >= igniter[2] then | ||||
| 							hp_change = 0 | ||||
| 						end | ||||
| 					end | ||||
| @@ -501,5 +519,3 @@ if armor.config.fire_protect == true then | ||||
| 		return hp_change | ||||
| 	end, true) | ||||
| end | ||||
|  | ||||
| minetest.log("action", "[3d_armor] loaded.") | ||||
|   | ||||
							
								
								
									
										7
									
								
								3d_armor/locale/3d_armor.de.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
| Radiation=Strahlen | ||||
| Level=Stufe | ||||
| Heal=Heilen | ||||
| Fire=Feuer | ||||
| Your @1 is almost broken!=Deine @1 ist fast kaputt! | ||||
| Your @1 got destroyed!=Deine @1 wurde zerstört! | ||||
							
								
								
									
										7
									
								
								3d_armor/locale/3d_armor.eo.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
| Radiation=Radiado | ||||
| Level=Nivelo | ||||
| Heal=Sanigi | ||||
| Fire=Fajro | ||||
| Your @1 is almost broken!=Via @1 estas preskaŭ rompita! | ||||
| Your @1 got destroyed!=Via @1 detruiĝis! | ||||
| @@ -1,58 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: La armadura desconectada es nula @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: El nombre del jugador es nulo @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: La referencia del jugador es nula @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Botas de admin | ||||
| Admin Chestplate=Peto de admin | ||||
| Admin Helmet=Casco de admin | ||||
| Admin Leggings=Grebas de admin | ||||
| Bronze Boots=Botas de bronce | ||||
| Bronze Chestplate=Peto de bronce | ||||
| Bronze Helmet=Casco de bronce | ||||
| Bronze Leggings=Grebas de bronce | ||||
| Cactus Boots=Botas de cactus | ||||
| Cactus Chestplate=Peto de cactus | ||||
| Cactus Helmet=Casco de cactus | ||||
| Cactus Leggings=Grebas de cactus | ||||
| Crystal Boots=Botas de cristal | ||||
| Crystal Chestplate=Peto de cristal | ||||
| Crystal Helmet=Casco de cristal | ||||
| Crystal Leggings=Grebas de cristal | ||||
| Diamond Boots=Botas de diamante | ||||
| Diamond Chestplate=Peto de diamante | ||||
| Diamond Helmet=Casco de diamante | ||||
| Diamond Leggings=Grebas de diamante | ||||
| Gold Boots=Botas de oro | ||||
| Gold Chestplate=Peto de oro | ||||
| Gold Helmet=Casco de oro | ||||
| Gold Leggings=Grebas de oro | ||||
| Mithril Boots=Botas de mitrilo | ||||
| Mithril Chestplate=Peto de mitrilo | ||||
| Mithril Helmet=Casco de mitrilo | ||||
| Mithril Leggings=Grebas de mitrilo | ||||
| Steel Boots=Botas de acero | ||||
| Steel Chestplate=Peto de acero | ||||
| Steel Helmet=Casco de acero | ||||
| Steel Leggings=Grebas de acero | ||||
| Wood Boots=Botas de madera | ||||
| Wood Chestplate=Peto de madera | ||||
| Wood Helmet=Casco de madera | ||||
| Wood Leggings=Grebas de madera | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: Fallo en la inicialización del jugador | ||||
| Fire=Fuego | ||||
| Heal=Salud | ||||
| Level=Nivel | ||||
| Radiation=Radiación | ||||
| Your @1 got destroyed!=¡Tu @1 fue destruído! | ||||
| Level=Nivel | ||||
| Heal=Salud | ||||
| Fire=Fuego | ||||
| Your @1 is almost broken!=¡Tu @1 esta a punto de romperse! | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nodos de fuego desabilitados | ||||
| Your @1 got destroyed!=¡Tu @1 fue destruído! | ||||
|   | ||||
| @@ -1,58 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor : Inventaire détaché pour l'armure non trouvé @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor : Nom du joueur non trouvé @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor : Référence au joueur non trouvée @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Bottes d'admin | ||||
| Admin Chestplate=Cuirasse d'admin | ||||
| Admin Helmet=Casque d'admin | ||||
| Admin Leggings=Jambières d'admin | ||||
| Bronze Boots=Bottes en bronze | ||||
| Bronze Chestplate=Cuirasse en bronze | ||||
| Bronze Helmet=Casque en bronze | ||||
| Bronze Leggings=Jambières en bronze | ||||
| Cactus Boots=Bottes en cactus | ||||
| Cactus Chestplate=Cuirasse en cactus | ||||
| Cactus Helmet=Casque en cactus | ||||
| Cactus Leggings=Jambières en cactus | ||||
| Crystal Boots=Bottes en cristal | ||||
| Crystal Chestplate=Cuirasse en cristal | ||||
| Crystal Helmet=Casque en cristal | ||||
| Crystal Leggings=Jambières en cristal | ||||
| Diamond Boots=Bottes en diamant | ||||
| Diamond Chestplate=Cuirasse en diamant | ||||
| Diamond Helmet=Casque en diamant | ||||
| Diamond Leggings=Jambières en diamant | ||||
| Gold Boots=Bottes en or | ||||
| Gold Chestplate=Cuirasse en or | ||||
| Gold Helmet=Casque en or | ||||
| Gold Leggings=Jambières en or | ||||
| Mithril Boots=Bottes en mithril | ||||
| Mithril Chestplate=Cuirasse en mithril | ||||
| Mithril Helmet=Casque en mithril | ||||
| Mithril Leggings=Jambières en mithril | ||||
| Steel Boots=Bottes en acier | ||||
| Steel Chestplate=Cuirasse en acier | ||||
| Steel Helmet=Casque en acier | ||||
| Steel Leggings=Jambières en acier | ||||
| Wood Boots=Bottes en bois | ||||
| Wood Chestplate=Cuirasse en bois | ||||
| Wood Helmet=Casque en bois | ||||
| Wood Leggings=Jambières en bois | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor : Impossible d'initialiser le joueur | ||||
| Fire=Fire | ||||
| Heal=Soins | ||||
| Level=Niveau | ||||
| Radiation=Radiation | ||||
| Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! | ||||
| Level=Niveau | ||||
| Heal=Soins | ||||
| Fire=Fire | ||||
| Your @1 is almost broken!=Une partie de votre armure est presque détruite : @1 ! | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nœuds de type feu désactivés | ||||
| Your @1 got destroyed!=Une partie de votre armure a été détruite : @1 ! | ||||
|   | ||||
| @@ -1,85 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: L'inventario separato dell'armatura è nullo @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: Il nome dell'utente è nullo @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: Il riferimento all'utente è nullo @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Stivali dell'amministratrice/tore | ||||
| Admin Chestplate=Corazza dell'amministratrice/tore | ||||
| Admin Helmet=Elmo dell'amministratrice/tore | ||||
| Admin Leggings=Gambali dell'amministratrice/tore | ||||
| Bronze Boots=Stivali di bronzo | ||||
| Bronze Chestplate=Corazza di bronzo | ||||
| Bronze Helmet=Elmo di bronzo | ||||
| Bronze Leggings=Gambali di bronzo | ||||
| Cactus Boots=Stivali di cactus | ||||
| Cactus Chestplate=Corazza di cactus | ||||
| Cactus Helmet=Elmo di cactus | ||||
| Cactus Leggings=Gambali di cactus | ||||
| Crystal Boots=Stivali di cristallo | ||||
| Crystal Chestplate=Corazza di cristallo | ||||
| Crystal Helmet=Elmo di cristallo | ||||
| Crystal Leggings=Gambali di cristallo | ||||
| Diamond Boots=Stivali di diamante | ||||
| Diamond Chestplate=Corazza di diamante | ||||
| Diamond Helmet=Elmo di diamante | ||||
| Diamond Leggings=Gambali di diamante | ||||
| Gold Boots=Stivali d'oro | ||||
| Gold Chestplate=Corazza d'oro | ||||
| Gold Helmet=Elmo d'oro | ||||
| Gold Leggings=Gambali d'oro | ||||
| Mithril Boots=Stivali di mithril | ||||
| Mithril Chestplate=Corazza di mithril | ||||
| Mithril Helmet=Elmo di mithril | ||||
| Mithril Leggings=Gambali di mithril | ||||
| Steel Boots=Stivali d'acciaio | ||||
| Steel Chestplate=Corazza d'acciaio | ||||
| Steel Helmet=Elmo d'acciaio | ||||
| Steel Leggings=Gambali d'acciaio | ||||
| Wood Boots=Stivali di legno | ||||
| Wood Chestplate=Corazza di legno | ||||
| Wood Helmet=Elmo di legno | ||||
| Wood Leggings=Gambali di legno | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: Inizializzazione dell'utente fallita | ||||
| Fire=Fuoco | ||||
| Heal=Guarigione | ||||
| Level=Livello | ||||
| Radiation=Radiazione | ||||
| Your @1 got destroyed!=@1 in frantumi! | ||||
| Level=Livello | ||||
| Heal=Guarigione | ||||
| Fire=Fuoco | ||||
| Your @1 is almost broken!=@1 quasi in frantumi! | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nodi fuoco disabilitati | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| 3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod caricata ma inutilizzata. | ||||
| Back=Indietro | ||||
| Armor=Armatura | ||||
| 3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod caricata ma inutilizzata. | ||||
| Armor stand top=Parte superiore del supporto per armatura | ||||
| Armor stand=Supporto per armatura | ||||
| Armor Stand=Supporto per armatura | ||||
| Locked Armor stand=Supporto per armatura chiuso a chiave | ||||
| Armor Stand (owned by @1)=Supporto per armatura (di proprietà di @1) | ||||
| 3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod caricata ma inutilizzata. | ||||
| 3d Armor=Armatura 3D | ||||
| Armor not initialized!=Armatura non inizializzata! | ||||
| Admin Shield=Scudo dell'amministratrice/tore | ||||
| Wooden Shield=Scudo di legno | ||||
| Enhanced Wood Shield=Scudo di legno migliorato | ||||
| Cactus Shield=Scudo di cactus | ||||
| Enhanced Cactus Shield=Scudo di cactus migliorato | ||||
| Steel Shield=Scudo d'acciaio | ||||
| Bronze Shield=Scudo di bronzo | ||||
| Diamond Shield=Scudo di diamante | ||||
| Gold Shield=Scudo d'oro | ||||
| Mithril Shield=Scudo di mithril | ||||
| Crystal Shield=Scudo di cristallo | ||||
| Your @1 got destroyed!=@1 in frantumi! | ||||
|   | ||||
| @@ -1,85 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: Inventori perisai terpisah tiada nilai @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: Nama pemain tiada nilai @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: Rujukan pemain tiada nilai @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=But Pentadbir | ||||
| Admin Chestplate=Perisai Dada Pentadbir | ||||
| Admin Helmet=Helmet Pentadbir | ||||
| Admin Leggings=Perisai Kaki Pentadbir | ||||
| Bronze Boots=But Gangsa | ||||
| Bronze Chestplate=Perisai Dada Gangsa | ||||
| Bronze Helmet=Helmet Gangsa | ||||
| Bronze Leggings=Perisai Kaki Gangsa | ||||
| Cactus Boots=But Kaktus | ||||
| Cactus Chestplate=Perisai Dada Kaktus | ||||
| Cactus Helmet=Helmet Kaktus | ||||
| Cactus Leggings=Perisai Kaki Kaktus | ||||
| Crystal Boots=But Kristal | ||||
| Crystal Chestplate=Perisai Dada Kristal | ||||
| Crystal Helmet=Helmet Kristal | ||||
| Crystal Leggings=Perisai Kaki Kristal | ||||
| Diamond Boots=But Intan | ||||
| Diamond Chestplate=Perisai Dada Intan | ||||
| Diamond Helmet=Helmet Intan | ||||
| Diamond Leggings=Perisai Kaki Intan | ||||
| Gold Boots=But Emas | ||||
| Gold Chestplate=Perisai Dada Emas | ||||
| Gold Helmet=Helmet Emas | ||||
| Gold Leggings=Perisai Kaki Emas | ||||
| Mithril Boots=But Mithril | ||||
| Mithril Chestplate=Perisai Dada Mithril | ||||
| Mithril Helmet=Helmet Mithril | ||||
| Mithril Leggings=Perisai Kaki Mithril | ||||
| Steel Boots=But Keluli | ||||
| Steel Chestplate=Perisai Dada Keluli | ||||
| Steel Helmet=Helmet Keluli | ||||
| Steel Leggings=Perisai Kaki Keluli | ||||
| Wood Boots=But Kayu | ||||
| Wood Chestplate=Perisai Dada Kayu | ||||
| Wood Helmet=Helmet Kayu | ||||
| Wood Leggings=Perisai Kaki Kayu | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: Gagal mengasalkan pemain | ||||
| Fire=Api | ||||
| Heal=Pulih | ||||
| Level=Tahap | ||||
| Radiation=Radiasi | ||||
| Your @1 got destroyed!=@1 anda telah musnah! | ||||
| Level=Tahap | ||||
| Heal=Pulih | ||||
| Fire=Api | ||||
| Your @1 is almost broken!= | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nod-nod Api dilumpuhkan | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| 3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mods dimuatkan tetapi tidak digunakan. | ||||
| Back=Kembali | ||||
| Armor=Perisai | ||||
| 3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan. | ||||
| Armor stand top=Bhg atas dirian perisai | ||||
| Armor stand=Dirian perisai | ||||
| Armor Stand=Dirian Perisai | ||||
| Locked Armor stand=Dirian perisai Berkunci | ||||
| Armor Stand (owned by @1)=Dirian Perisai (milik @1) | ||||
| 3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mods dimuatkan tetapi tidak digunakan. | ||||
| 3d Armor=Perisai 3d | ||||
| Armor not initialized!=Perisai tidak diasalkan! | ||||
| Admin Shield=Perisai Pegang Pentadbir | ||||
| Wooden Shield=Perisai Pegang Kayu | ||||
| Enhanced Wood Shield=Perisai Pegang Kayu Kukuh | ||||
| Cactus Shield=Perisai Pegang Kaktus | ||||
| Enhanced Cactus Shield=Perisai Pegang Kaktus Kukuh | ||||
| Steel Shield=Perisai Pegang Keluli | ||||
| Bronze Shield=Perisai Pegang Gangsa | ||||
| Diamond Shield=Perisai Pegang Intan | ||||
| Gold Shield=Perisai Pegang Emas | ||||
| Mithril Shield=Perisai Pegang Mithril | ||||
| Crystal Shield=Perisai Pegang Kristal | ||||
| Your @1 got destroyed!=@1 anda telah musnah! | ||||
|   | ||||
| @@ -1,85 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Botas de Administrador | ||||
| Admin Chestplate=Peitoral de Administrador | ||||
| Admin Helmet=Capacete de Administrador | ||||
| Admin Leggings=Calças de Administrador | ||||
| Bronze Boots=Botas de Bronze | ||||
| Bronze Chestplate=Peitoral de Bronze | ||||
| Bronze Helmet=Capacete de Bronze | ||||
| Bronze Leggings=Calças de Bronze | ||||
| Cactus Boots=Botas de Madeira | ||||
| Cactus Chestplate=Peitoral de Cacto | ||||
| Cactus Helmet=Capacete de Cacto | ||||
| Cactus Leggings=Calças de Cacto | ||||
| Crystal Boots=Botas de Cristal | ||||
| Crystal Chestplate=Peitoral de Cristal | ||||
| Crystal Helmet=Capacete de Cristal | ||||
| Crystal Leggings=Calças de Cristal | ||||
| Diamond Boots=Botas de Diamante | ||||
| Diamond Chestplate=Peitoral de Diamante | ||||
| Diamond Helmet=Capacete de Diamante | ||||
| Diamond Leggings=Calças de Diamante | ||||
| Gold Boots=Botas de Ouro | ||||
| Gold Chestplate=Peitoral de Ouro | ||||
| Gold Helmet=Capacete de Ouro | ||||
| Gold Leggings=Calças de Ouro | ||||
| Mithril Boots=Botas de Mithril | ||||
| Mithril Chestplate=Peitoral de Mithril | ||||
| Mithril Helmet=Capacete de Mithril | ||||
| Mithril Leggings=Calças de Mithril | ||||
| Steel Boots=Botas de Aço | ||||
| Steel Chestplate=Peitoral de Aço | ||||
| Steel Helmet=Capacete de Aço | ||||
| Steel Leggings=Calças de Aço | ||||
| Wood Boots=Botas de Madeira | ||||
| Wood Chestplate=Peitoral de Madeira | ||||
| Wood Helmet=Capacete de Madeira | ||||
| Wood Leggings=Calças de Madeira | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador | ||||
| Fire=Fogo | ||||
| Heal=Saúde | ||||
| Level=Nível | ||||
| Radiation=Radiação | ||||
| Your @1 got destroyed!=@1 foi destruído(a)! | ||||
| Level=Nível | ||||
| Heal=Saúde | ||||
| Fire=Fogo | ||||
| Your @1 is almost broken!= | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| 3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. | ||||
| Back=Voltar | ||||
| Armor=Armadura | ||||
| 3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. | ||||
| Armor stand top=Topo de estande de armadura | ||||
| Armor stand=Estande de armadura | ||||
| Armor Stand=Estande de Armadura | ||||
| Locked Armor stand=Estande de Armadura Trancada | ||||
| Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) | ||||
| 3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. | ||||
| 3d Armor=3d Armor | ||||
| Armor not initialized!=Armadura não inicializada! | ||||
| Admin Shield=Escudo de Administrador | ||||
| Wooden Shield=Escudo de Madeira | ||||
| Enhanced Wood Shield=Escudo de Madeira Melhorado | ||||
| Cactus Shield=Escudo de Cacto | ||||
| Enhanced Cactus Shield=Escudo de Cacto Melhorado | ||||
| Steel Shield=Escudo de Aço | ||||
| Bronze Shield=Escudo de Bronze | ||||
| Diamond Shield=Escudo de Diamante | ||||
| Gold Shield=Escudo de Ouro | ||||
| Mithril Shield=Escudo de Mithril | ||||
| Crystal Shield=Escudo de Cristal | ||||
| Your @1 got destroyed!=@1 foi destruído(a)! | ||||
|   | ||||
| @@ -1,85 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: Inventario avulso de armadura é nulo @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: Nome de jogador é nulo @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: Referência Jogador é nula @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=Botas de Administrador | ||||
| Admin Chestplate=Peitoral de Administrador | ||||
| Admin Helmet=Capacete de Administrador | ||||
| Admin Leggings=Calças de Administrador | ||||
| Bronze Boots=Botas de Bronze | ||||
| Bronze Chestplate=Peitoral de Bronze | ||||
| Bronze Helmet=Capacete de Bronze | ||||
| Bronze Leggings=Calças de Bronze | ||||
| Cactus Boots=Botas de Madeira | ||||
| Cactus Chestplate=Peitoral de Cacto | ||||
| Cactus Helmet=Capacete de Cacto | ||||
| Cactus Leggings=Calças de Cacto | ||||
| Crystal Boots=Botas de Cristal | ||||
| Crystal Chestplate=Peitoral de Cristal | ||||
| Crystal Helmet=Capacete de Cristal | ||||
| Crystal Leggings=Calças de Cristal | ||||
| Diamond Boots=Botas de Diamante | ||||
| Diamond Chestplate=Peitoral de Diamante | ||||
| Diamond Helmet=Capacete de Diamante | ||||
| Diamond Leggings=Calças de Diamante | ||||
| Gold Boots=Botas de Ouro | ||||
| Gold Chestplate=Peitoral de Ouro | ||||
| Gold Helmet=Capacete de Ouro | ||||
| Gold Leggings=Calças de Ouro | ||||
| Mithril Boots=Botas de Mithril | ||||
| Mithril Chestplate=Peitoral de Mithril | ||||
| Mithril Helmet=Capacete de Mithril | ||||
| Mithril Leggings=Calças de Mithril | ||||
| Steel Boots=Botas de Aço | ||||
| Steel Chestplate=Peitoral de Aço | ||||
| Steel Helmet=Capacete de Aço | ||||
| Steel Leggings=Calças de Aço | ||||
| Wood Boots=Botas de Madeira | ||||
| Wood Chestplate=Peitoral de Madeira | ||||
| Wood Helmet=Capacete de Madeira | ||||
| Wood Leggings=Calças de Madeira | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: Falha ao inicializar jogador | ||||
| Fire=Fogo | ||||
| Heal=Saúde | ||||
| Level=Nível | ||||
| Radiation=Radiação | ||||
| Your @1 got destroyed!=@1 foi destruído(a)! | ||||
| Level=Nível | ||||
| Heal=Saúde | ||||
| Fire=Fogo | ||||
| Your @1 is almost broken!= | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] Nodes de gofo desabilitados | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| 3d_armor_ip: Mod loaded but unused.=3d_armor_ip: Mod carregado mas inoperante. | ||||
| Back=Voltar | ||||
| Armor=Armadura | ||||
| 3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: Mod carregado mas inoperante. | ||||
| Armor stand top=Topo de estande de armadura | ||||
| Armor stand=Estande de armadura | ||||
| Armor Stand=Estande de Armadura | ||||
| Locked Armor stand=Estande de Armadura Trancada | ||||
| Armor Stand (owned by @1)=Estande de Armadura (pertente a @1) | ||||
| 3d_armor_ui: Mod loaded but unused.=3d_armor_ui: Mod carregado mas inoperante. | ||||
| 3d Armor=3d Armor | ||||
| Armor not initialized!=Armadura não inicializada! | ||||
| Admin Shield=Escudo de Administrador | ||||
| Wooden Shield=Escudo de Madeira | ||||
| Enhanced Wood Shield=Escudo de Madeira Melhorado | ||||
| Cactus Shield=Escudo de Cacto | ||||
| Enhanced Cactus Shield=Escudo de Cacto Melhorado | ||||
| Steel Shield=Escudo de Aço | ||||
| Bronze Shield=Escudo de Bronze | ||||
| Diamond Shield=Escudo de Diamante | ||||
| Gold Shield=Escudo de Ouro | ||||
| Mithril Shield=Escudo de Mithril | ||||
| Crystal Shield=Escudo de Cristal | ||||
| Your @1 got destroyed!=@1 foi destruído(a)! | ||||
|   | ||||
| @@ -1,85 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1=3d_armor: Отдельный инвентарь брони является nil @1 | ||||
| 3d_armor: Player name is nil @1=3d_armor: Имя игрока является nil @1 | ||||
| 3d_armor: Player reference is nil @1=3d_armor: Ссылка игрока является nil @1 | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots=ботинки админа | ||||
| Admin Chestplate=бронежилет админа | ||||
| Admin Helmet=шлем админа | ||||
| Admin Leggings=гамаши админа | ||||
| Bronze Boots=бронзовые ботинки | ||||
| Bronze Chestplate=бронзовый бронежилет | ||||
| Bronze Helmet=бронзовый шлем | ||||
| Bronze Leggings=бронзовые гамаши | ||||
| Cactus Boots=кактусовые ботинки | ||||
| Cactus Chestplate=кактусовый бронежилет | ||||
| Cactus Helmet=кактусовый шлем | ||||
| Cactus Leggings=кактусовые гамаши | ||||
| Crystal Boots=кристалловые ботинки | ||||
| Crystal Chestplate=кристалловый бронежилет | ||||
| Crystal Helmet=кристалловый шлем | ||||
| Crystal Leggings=кристалловые гамаши | ||||
| Diamond Boots=алмазные ботинки | ||||
| Diamond Chestplate=алмазный бронежилет | ||||
| Diamond Helmet=алмазный шлем | ||||
| Diamond Leggings=алмазные гамаши | ||||
| Gold Boots=золотые ботинки | ||||
| Gold Chestplate=золотой бронежилет | ||||
| Gold Helmet=золотой шлем | ||||
| Gold Leggings=золотые гамаши | ||||
| Mithril Boots=мифриловые ботинки | ||||
| Mithril Chestplate=мифриловый бронежилет | ||||
| Mithril Helmet=мифриловый шлем | ||||
| Mithril Leggings=мифриловые гамаши | ||||
| Steel Boots=стальные ботинки | ||||
| Steel Chestplate=стальной бронежилет | ||||
| Steel Helmet=стальной шлем | ||||
| Steel Leggings=стальные гамаши | ||||
| Wood Boots=деревянные ботинки | ||||
| Wood Chestplate=деревянный бронежилет | ||||
| Wood Helmet=деревянный шлем | ||||
| Wood Leggings=деревянные гамаши | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player=3d_armor: не смог подготовить игрока | ||||
| Fire=огонь | ||||
| Heal=исцеление | ||||
| Level=уровень | ||||
| Radiation=излучение | ||||
| Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)! | ||||
| Level=уровень | ||||
| Heal=исцеление | ||||
| Fire=огонь | ||||
| Your @1 is almost broken!= | ||||
| [3d_armor] Fire Nodes disabled=[3d_armor] блоки огня отключены | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| 3d_armor_ip: Mod loaded but unused.=3d_armor_ip: мод загружен но не используется. | ||||
| Back=назад | ||||
| Armor=бронь | ||||
| 3d_armor_sfinv: Mod loaded but unused.=3d_armor_sfinv: мод загружен но не используется. | ||||
| Armor stand top=стойка для брони (верх) | ||||
| Armor stand=стойка для брони | ||||
| Armor Stand=стойка для брони | ||||
| Locked Armor stand=защищенная стойка для брони | ||||
| Armor Stand (owned by @1)=стойка для брони (принадлежит @1) | ||||
| 3d_armor_ui: Mod loaded but unused.=3d_armor_ui: мод загружен но не используется. | ||||
| 3d Armor=3D бронь | ||||
| Armor not initialized!=бронь не подготовлена! | ||||
| Admin Shield=щит админа | ||||
| Wooden Shield=деревянный щит | ||||
| Enhanced Wood Shield=улучшенный деревянный щит | ||||
| Cactus Shield=кактусный щит | ||||
| Enhanced Cactus Shield=улучшенный кактусный щит | ||||
| Steel Shield=стальной щит | ||||
| Bronze Shield=бронзовый щит | ||||
| Diamond Shield=алмазный щит | ||||
| Gold Shield=золотой щит | ||||
| Mithril Shield=мифриловый щит | ||||
| Crystal Shield=кристалловый щит | ||||
| Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)! | ||||
|   | ||||
							
								
								
									
										7
									
								
								3d_armor/locale/3d_armor.sv.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
| Radiation=Strålning | ||||
| Level=Nivå | ||||
| Heal=Läkning | ||||
| Fire=Eld | ||||
| Your @1 is almost broken!=Din @1 är nästan förstörd! | ||||
| Your @1 got destroyed!=Din @1 blev förstörd! | ||||
| @@ -1,58 +1,7 @@ | ||||
| # textdomain: 3d_armor | ||||
|  | ||||
|  | ||||
| ### api.lua ### | ||||
|  | ||||
| 3d_armor: Detached armor inventory is nil @1= | ||||
| 3d_armor: Player name is nil @1= | ||||
| 3d_armor: Player reference is nil @1= | ||||
|  | ||||
| ### armor.lua ### | ||||
|  | ||||
| Admin Boots= | ||||
| Admin Chestplate= | ||||
| Admin Helmet= | ||||
| Admin Leggings= | ||||
| Bronze Boots= | ||||
| Bronze Chestplate= | ||||
| Bronze Helmet= | ||||
| Bronze Leggings= | ||||
| Cactus Boots= | ||||
| Cactus Chestplate= | ||||
| Cactus Helmet= | ||||
| Cactus Leggings= | ||||
| Crystal Boots= | ||||
| Crystal Chestplate= | ||||
| Crystal Helmet= | ||||
| Crystal Leggings= | ||||
| Diamond Boots= | ||||
| Diamond Chestplate= | ||||
| Diamond Helmet= | ||||
| Diamond Leggings= | ||||
| Gold Boots= | ||||
| Gold Chestplate= | ||||
| Gold Helmet= | ||||
| Gold Leggings= | ||||
| Mithril Boots= | ||||
| Mithril Chestplate= | ||||
| Mithril Helmet= | ||||
| Mithril Leggings= | ||||
| Steel Boots= | ||||
| Steel Chestplate= | ||||
| Steel Helmet= | ||||
| Steel Leggings= | ||||
| Wood Boots= | ||||
| Wood Chestplate= | ||||
| Wood Helmet= | ||||
| Wood Leggings= | ||||
|  | ||||
| ### init.lua ### | ||||
|  | ||||
| 3d_armor: Failed to initialize player= | ||||
| Fire= | ||||
| Heal= | ||||
| Level= | ||||
| Radiation= | ||||
| Your @1 got destroyed!= | ||||
| Level= | ||||
| Heal= | ||||
| Fire= | ||||
| Your @1 is almost broken!= | ||||
| [3d_armor] Fire Nodes disabled= | ||||
| Your @1 got destroyed!= | ||||
|   | ||||
| @@ -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, moreores | ||||
| description = Adds craftable armor that is visible to other players. | ||||
|   | ||||
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 548 B | 
| Before Width: | Height: | Size: 937 B | 
| Before Width: | Height: | Size: 602 B | 
| Before Width: | Height: | Size: 903 B | 
| Before Width: | Height: | Size: 821 B | 
| Before Width: | Height: | Size: 236 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 872 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 779 B | 
| Before Width: | Height: | Size: 854 B | 
| Before Width: | Height: | Size: 530 B | 
| Before Width: | Height: | Size: 11 KiB | 
| Before Width: | Height: | Size: 783 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 501 B | 
| Before Width: | Height: | Size: 3.8 KiB | 
| Before Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 2.5 KiB | 
| Before Width: | Height: | Size: 3.3 KiB | 
| Before Width: | Height: | Size: 2.9 KiB | 
| Before Width: | Height: | Size: 613 B | 
| Before Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 2.9 KiB | 
| Before Width: | Height: | Size: 6.6 KiB | 
| Before Width: | Height: | Size: 2.9 KiB | 
| Before Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 11 KiB | 
| Before Width: | Height: | Size: 2.7 KiB | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 1.7 KiB | 
| Before Width: | Height: | Size: 3.2 KiB | 
| Before Width: | Height: | Size: 869 B | 
| Before Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 796 B | 
| Before Width: | Height: | Size: 3.5 KiB | 
| Before Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 494 B | 
| Before Width: | Height: | Size: 834 B | 
| Before Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 586 B | 
| Before Width: | Height: | Size: 1.7 KiB | 
| Before Width: | Height: | Size: 732 B | 
| Before Width: | Height: | Size: 11 KiB | 
| Before Width: | Height: | Size: 1.0 KiB | 
| Before Width: | Height: | Size: 932 B | 
| Before Width: | Height: | Size: 471 B | 
| Before Width: | Height: | Size: 2.2 KiB | 
| Before Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 129 B | 
| Before Width: | Height: | Size: 2.3 KiB | 
| Before Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 1.7 KiB | 
| Before Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 2.0 KiB | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 2.9 KiB | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 142 B | 
| Before Width: | Height: | Size: 2.8 KiB | 
| Before Width: | Height: | Size: 2.8 KiB |