Compare commits
	
		
			14 Commits
		
	
	
		
			c95eb77a4e
			...
			multiskin
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9f49060ae6 | ||
| 
						 | 
					8e8c79aca2 | ||
| 
						 | 
					601fee1079 | ||
| 
						 | 
					c36b1e5fc4 | ||
| 
						 | 
					b1f9e9f1fd | ||
| 
						 | 
					f150e4c988 | ||
| 
						 | 
					503f44ac70 | ||
| 
						 | 
					eb7a52daff | ||
| 
						 | 
					753be543f1 | ||
| 
						 | 
					35db060560 | ||
| 
						 | 
					fd77253816 | ||
| 
						 | 
					f6502ba32b | ||
| 
						 | 
					aa9984b789 | ||
| 
						 | 
					afce9f1140 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -6,3 +6,6 @@ tags
 | 
			
		||||
*.vim
 | 
			
		||||
armor.conf
 | 
			
		||||
 | 
			
		||||
## Eclipse project files & directories
 | 
			
		||||
.project
 | 
			
		||||
.settings
 | 
			
		||||
 
 | 
			
		||||
@@ -68,6 +68,9 @@ armor_fire_protect = false
 | 
			
		||||
-- Enable punch damage effects.
 | 
			
		||||
armor_punch_damage = true
 | 
			
		||||
 | 
			
		||||
-- Enable migration of old armor inventories
 | 
			
		||||
armor_migrate_old_inventory = true
 | 
			
		||||
 | 
			
		||||
API
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										152
									
								
								3d_armor/api.lua
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,4 @@
 | 
			
		||||
local skin_previews = {}
 | 
			
		||||
local use_multiskin = minetest.global_exists("multiskin")
 | 
			
		||||
local use_player_monoids = minetest.global_exists("player_monoids")
 | 
			
		||||
local use_armor_monoid = minetest.global_exists("armor_monoid")
 | 
			
		||||
local armor_def = setmetatable({}, {
 | 
			
		||||
@@ -39,7 +39,7 @@ armor = {
 | 
			
		||||
		"list[current_player;main;0,5.85;8,3;8]",
 | 
			
		||||
	def = armor_def,
 | 
			
		||||
	textures = armor_textures,
 | 
			
		||||
	default_skin = "character",
 | 
			
		||||
	default_skin = "character.png",
 | 
			
		||||
	materials = {
 | 
			
		||||
		wood = "group:wood",
 | 
			
		||||
		cactus = "default:cactus",
 | 
			
		||||
@@ -69,6 +69,7 @@ armor = {
 | 
			
		||||
		on_damage = {},
 | 
			
		||||
		on_destroy = {},
 | 
			
		||||
	},
 | 
			
		||||
	migrate_old_inventory = true,
 | 
			
		||||
	version = "0.4.9",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -156,35 +157,45 @@ armor.run_callbacks = function(self, callback, player, index, stack)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.update_player_visuals = function(self, player)
 | 
			
		||||
	if not player then
 | 
			
		||||
	local name = self:get_valid_player(player, "[update_player_visuals]")
 | 
			
		||||
	if not name then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local name = player:get_player_name()
 | 
			
		||||
	if self.textures[name] then
 | 
			
		||||
		default.player_set_textures(player, {
 | 
			
		||||
			self.textures[name].skin,
 | 
			
		||||
			self.textures[name].armor,
 | 
			
		||||
			self.textures[name].wielditem,
 | 
			
		||||
		})
 | 
			
		||||
	local textures = {
 | 
			
		||||
		"blank.png",
 | 
			
		||||
		"blank.png",
 | 
			
		||||
		self.textures[name].armor,
 | 
			
		||||
		self.textures[name].wielditem,
 | 
			
		||||
	}
 | 
			
		||||
	if use_multiskin then
 | 
			
		||||
		multiskin.textures[name] = textures
 | 
			
		||||
		multiskin.update_player_visuals(player)
 | 
			
		||||
	else
 | 
			
		||||
		textures[1] = armor.default_skin
 | 
			
		||||
		default.player_set_textures(player, textures)
 | 
			
		||||
	end
 | 
			
		||||
	self:run_callbacks("on_update", player)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.set_player_armor = function(self, player)
 | 
			
		||||
	local name, player_inv = self:get_valid_player(player, "[set_player_armor]")
 | 
			
		||||
	local name, armor_inv = self:get_valid_player(player, "[set_player_armor]")
 | 
			
		||||
	if not name then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local state = 0
 | 
			
		||||
	local count = 0
 | 
			
		||||
	local material = {count=1}
 | 
			
		||||
	local preview = armor:get_preview(name)
 | 
			
		||||
	local texture = "3d_armor_trans.png"
 | 
			
		||||
	local preview = "3d_armor_preview.png"
 | 
			
		||||
	local texture = "blank.png"
 | 
			
		||||
	local textures = {}
 | 
			
		||||
	local physics = {}
 | 
			
		||||
	local attributes = {}
 | 
			
		||||
	local levels = {}
 | 
			
		||||
	local groups = {}
 | 
			
		||||
	local change = {}
 | 
			
		||||
	if use_multiskin then
 | 
			
		||||
		preview = multiskin.get_preview(player) or preview
 | 
			
		||||
	end
 | 
			
		||||
	for _, phys in pairs(self.physics) do
 | 
			
		||||
		physics[phys] = 1
 | 
			
		||||
	end
 | 
			
		||||
@@ -195,7 +206,10 @@ armor.set_player_armor = function(self, player)
 | 
			
		||||
		change[group] = 1
 | 
			
		||||
		levels[group] = 0
 | 
			
		||||
	end
 | 
			
		||||
	local list = player_inv:get_list("armor")
 | 
			
		||||
	local list = armor_inv:get_list("armor")
 | 
			
		||||
	if type(list) ~= "table" then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	for i, stack in pairs(list) do
 | 
			
		||||
		if stack:get_count() == 1 then
 | 
			
		||||
			local def = stack:get_definition()
 | 
			
		||||
@@ -211,6 +225,7 @@ armor.set_player_armor = function(self, player)
 | 
			
		||||
						local level = def.groups["armor_"..element]
 | 
			
		||||
						levels["fleshy"] = levels["fleshy"] + level
 | 
			
		||||
					end
 | 
			
		||||
					break
 | 
			
		||||
				end
 | 
			
		||||
				-- DEPRECATED, use armor_groups instead
 | 
			
		||||
				if def.groups["armor_radiation"] and levels["radiation"] then
 | 
			
		||||
@@ -286,11 +301,10 @@ armor.set_player_armor = function(self, player)
 | 
			
		||||
	self.def[name].state = state
 | 
			
		||||
	self.def[name].count = count
 | 
			
		||||
	self:update_player_visuals(player)
 | 
			
		||||
	self:run_callbacks("on_update", player)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities)
 | 
			
		||||
	local name, player_inv = self:get_valid_player(player, "[punch]")
 | 
			
		||||
	local name, armor_inv = self:get_valid_player(player, "[punch]")
 | 
			
		||||
	if not name then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
@@ -298,7 +312,7 @@ armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabili
 | 
			
		||||
	local count = 0
 | 
			
		||||
	local recip = true
 | 
			
		||||
	local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
 | 
			
		||||
	local list = player_inv:get_list("armor")
 | 
			
		||||
	local list = armor_inv:get_list("armor")
 | 
			
		||||
	for i, stack in pairs(list) do
 | 
			
		||||
		if stack:get_count() == 1 then
 | 
			
		||||
			local name = stack:get_name()
 | 
			
		||||
@@ -375,33 +389,6 @@ armor.damage = function(self, player, index, stack, use)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.get_player_skin = function(self, name)
 | 
			
		||||
	local skin = nil
 | 
			
		||||
	if self.skin_mod == "skins" or self.skin_mod == "simple_skins" then
 | 
			
		||||
		skin = skins.skins[name]
 | 
			
		||||
	elseif self.skin_mod == "u_skins" then
 | 
			
		||||
		skin = u_skins.u_skins[name]
 | 
			
		||||
	elseif self.skin_mod == "wardrobe" then
 | 
			
		||||
		local skins = wardrobe.playerSkins or {}
 | 
			
		||||
		if skins[name] then
 | 
			
		||||
			skin = string.gsub(skins[name], "%.png$","")
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return skin or armor.default_skin
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.add_preview = function(self, preview)
 | 
			
		||||
	skin_previews[preview] = true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.get_preview = function(self, name)
 | 
			
		||||
	local preview = armor:get_player_skin(name).."_preview.png"
 | 
			
		||||
	if skin_previews[preview] then
 | 
			
		||||
		return preview
 | 
			
		||||
	end
 | 
			
		||||
	return "character_preview.png"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.get_armor_formspec = function(self, name, listring)
 | 
			
		||||
	if armor.def[name].init_time == 0 then
 | 
			
		||||
		return "label[0,0;Armor not initialized!]"
 | 
			
		||||
@@ -417,12 +404,64 @@ armor.get_armor_formspec = function(self, name, listring)
 | 
			
		||||
	for _, attr in pairs(self.attributes) do
 | 
			
		||||
		formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr])
 | 
			
		||||
	end
 | 
			
		||||
	for _, group in pairs(self.attributes) do
 | 
			
		||||
		formspec = formspec:gsub("armor_group_"..group, armor.def[name][group])
 | 
			
		||||
	for group, _ in pairs(self.registered_groups) do
 | 
			
		||||
		formspec = formspec:gsub("armor_group_"..group,
 | 
			
		||||
			armor.def[name].groups[group])
 | 
			
		||||
	end
 | 
			
		||||
	return formspec
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.serialize_inventory_list = function(self, list)
 | 
			
		||||
	local list_table = {}
 | 
			
		||||
	for _, stack in ipairs(list) do
 | 
			
		||||
		table.insert(list_table, stack:to_string())
 | 
			
		||||
	end
 | 
			
		||||
	return minetest.serialize(list_table)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.deserialize_inventory_list = function(self, list_string)
 | 
			
		||||
	local list_table = minetest.deserialize(list_string)
 | 
			
		||||
	local list = {}
 | 
			
		||||
	for _, stack in ipairs(list_table or {}) do
 | 
			
		||||
		table.insert(list, ItemStack(stack))
 | 
			
		||||
	end
 | 
			
		||||
	return list
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.load_armor_inventory = function(self, player)
 | 
			
		||||
	local msg = "[load_armor_inventory]"
 | 
			
		||||
	local name = player:get_player_name()
 | 
			
		||||
	if not name then
 | 
			
		||||
		minetest.log("warning", S("3d_armor: Player name is nil @1", msg))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"})
 | 
			
		||||
	if not armor_inv then
 | 
			
		||||
		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local armor_list_string = player:get_attribute("3d_armor_inventory")
 | 
			
		||||
	if armor_list_string then
 | 
			
		||||
		armor_inv:set_list("armor", self:deserialize_inventory_list(armor_list_string))
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.save_armor_inventory = function(self, player)
 | 
			
		||||
	local msg = "[save_armor_inventory]"
 | 
			
		||||
	local name = player:get_player_name()
 | 
			
		||||
	if not name then
 | 
			
		||||
		minetest.log("warning", S("3d_armor: Player name is nil @1", msg))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"})
 | 
			
		||||
	if not armor_inv then
 | 
			
		||||
		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	player:set_attribute("3d_armor_inventory", self:serialize_inventory_list(armor_inv:get_list("armor")))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.update_inventory = function(self, player)
 | 
			
		||||
	-- DEPRECATED: Legacy inventory support
 | 
			
		||||
end
 | 
			
		||||
@@ -434,17 +473,13 @@ armor.set_inventory_stack = function(self, player, i, stack)
 | 
			
		||||
		minetest.log("warning", "3d_armor: Player name is nil "..msg)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local player_inv = player:get_inventory()
 | 
			
		||||
	local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"})
 | 
			
		||||
	if not player_inv then
 | 
			
		||||
		minetest.log("warning", "3d_armor: Player inventory is nil "..msg)
 | 
			
		||||
		return
 | 
			
		||||
	elseif not armor_inv then
 | 
			
		||||
		minetest.log("warning", "3d_armor: Detached armor inventory is nil "..msg)
 | 
			
		||||
	if not armor_inv then
 | 
			
		||||
		minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	player_inv:set_stack("armor", i, stack)
 | 
			
		||||
	armor_inv:set_stack("armor", i, stack)
 | 
			
		||||
	self:save_armor_inventory(player)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.get_valid_player = function(self, player, msg)
 | 
			
		||||
@@ -458,7 +493,7 @@ armor.get_valid_player = function(self, player, msg)
 | 
			
		||||
		minetest.log("warning", "3d_armor: Player name is nil "..msg)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local inv = player:get_inventory()
 | 
			
		||||
	local inv = minetest.get_inventory({type="detached", name=name.."_armor"})
 | 
			
		||||
	if not inv then
 | 
			
		||||
		minetest.log("warning", "3d_armor: Player inventory is nil "..msg)
 | 
			
		||||
		return
 | 
			
		||||
@@ -467,8 +502,11 @@ armor.get_valid_player = function(self, player, msg)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor.drop_armor = function(pos, stack)
 | 
			
		||||
	local obj = minetest.add_item(pos, stack)
 | 
			
		||||
	if obj then
 | 
			
		||||
		obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)})
 | 
			
		||||
	local node = minetest.get_node_or_nil(pos)
 | 
			
		||||
	if node then
 | 
			
		||||
		local obj = minetest.add_item(pos, stack)
 | 
			
		||||
		if obj then
 | 
			
		||||
			obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)})
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,12 @@
 | 
			
		||||
local S = function(s) return s end
 | 
			
		||||
if minetest.global_exists("intllib") then
 | 
			
		||||
	S = intllib.Getter()
 | 
			
		||||
	if intllib.make_gettext_pair then
 | 
			
		||||
		-- New method using gettext.
 | 
			
		||||
		S = intllib.make_gettext_pair()
 | 
			
		||||
	else
 | 
			
		||||
		-- Old method using text files.
 | 
			
		||||
		S = intllib.Getter()
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
armor:register_armor("3d_armor:helmet_admin", {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,3 +5,4 @@ fire?
 | 
			
		||||
ethereal?
 | 
			
		||||
bakedclay?
 | 
			
		||||
intllib?
 | 
			
		||||
multiskin?
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,12 @@
 | 
			
		||||
local S = function(s) return s end
 | 
			
		||||
if minetest.global_exists("intllib") then
 | 
			
		||||
	S = intllib.Getter()
 | 
			
		||||
	if intllib.make_gettext_pair then
 | 
			
		||||
		-- New method using gettext.
 | 
			
		||||
		S = intllib.make_gettext_pair()
 | 
			
		||||
	else
 | 
			
		||||
		-- Old method using text files.
 | 
			
		||||
		S = intllib.Getter()
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
local modname = minetest.get_current_modname()
 | 
			
		||||
local modpath = minetest.get_modpath(modname)
 | 
			
		||||
@@ -41,11 +47,11 @@ end
 | 
			
		||||
-- Load Configuration
 | 
			
		||||
 | 
			
		||||
for name, config in pairs(armor.config) do
 | 
			
		||||
	local setting = minetest.setting_get("armor_"..name)
 | 
			
		||||
	local setting = minetest.settings:get("armor_"..name)
 | 
			
		||||
	if type(config) == "number" then
 | 
			
		||||
		setting = tonumber(setting)
 | 
			
		||||
	elseif type(config) == "boolean" then
 | 
			
		||||
		setting = minetest.setting_getbool("armor_"..name)
 | 
			
		||||
		setting = minetest.settings:get_bool("armor_"..name)
 | 
			
		||||
	end
 | 
			
		||||
	if setting ~= nil then
 | 
			
		||||
		armor.config[name] = setting
 | 
			
		||||
@@ -59,25 +65,14 @@ for material, _ in pairs(armor.materials) do
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Mod Compatibility
 | 
			
		||||
 | 
			
		||||
if minetest.get_modpath("multiskin") then
 | 
			
		||||
	multiskin.model = "3d_armor_character.b3d"
 | 
			
		||||
end
 | 
			
		||||
if minetest.get_modpath("technic") then
 | 
			
		||||
	armor.formspec = armor.formspec..
 | 
			
		||||
		"label[5,2.5;"..S("Radiation")..":  armor_group_radiation]"
 | 
			
		||||
	armor:register_armor_group("radiation")
 | 
			
		||||
end
 | 
			
		||||
local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"}
 | 
			
		||||
for _, mod in pairs(skin_mods) do
 | 
			
		||||
	local path = minetest.get_modpath(mod)
 | 
			
		||||
	if path then
 | 
			
		||||
		local dir_list = minetest.get_dir_list(path.."/textures")
 | 
			
		||||
		for _, fn in pairs(dir_list) do
 | 
			
		||||
			if fn:find("_preview.png$") then
 | 
			
		||||
				armor:add_preview(fn)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		armor.skin_mod = mod
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
if not minetest.get_modpath("moreores") then
 | 
			
		||||
	armor.materials.mithril = nil
 | 
			
		||||
end
 | 
			
		||||
@@ -106,27 +101,23 @@ end)
 | 
			
		||||
 | 
			
		||||
local function init_player_armor(player)
 | 
			
		||||
	local name = player:get_player_name()
 | 
			
		||||
	local player_inv = player:get_inventory()
 | 
			
		||||
	local pos = player:getpos()
 | 
			
		||||
	if not name or not player_inv or not pos then
 | 
			
		||||
	if not name or not pos then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
	local armor_inv = minetest.create_detached_inventory(name.."_armor", {
 | 
			
		||||
		on_put = function(inv, listname, index, stack, player)
 | 
			
		||||
			player:get_inventory():set_stack(listname, index, stack)
 | 
			
		||||
			armor:save_armor_inventory(player)
 | 
			
		||||
			armor:run_callbacks("on_equip", player, index, stack)
 | 
			
		||||
			armor:set_player_armor(player)
 | 
			
		||||
		end,
 | 
			
		||||
		on_take = function(inv, listname, index, stack, player)
 | 
			
		||||
			player:get_inventory():set_stack(listname, index, nil)
 | 
			
		||||
			armor:save_armor_inventory(player)
 | 
			
		||||
			armor:run_callbacks("on_unequip", player, index, stack)
 | 
			
		||||
			armor:set_player_armor(player)
 | 
			
		||||
		end,
 | 
			
		||||
		on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
 | 
			
		||||
			local plaver_inv = player:get_inventory()
 | 
			
		||||
			local stack = inv:get_stack(to_list, to_index)
 | 
			
		||||
			player_inv:set_stack(to_list, to_index, stack)
 | 
			
		||||
			player_inv:set_stack(from_list, from_index, nil)
 | 
			
		||||
			armor:save_armor_inventory(player)
 | 
			
		||||
			armor:set_player_armor(player)
 | 
			
		||||
		end,
 | 
			
		||||
		allow_put = function(inv, listname, index, stack, player)
 | 
			
		||||
@@ -153,10 +144,18 @@ local function init_player_armor(player)
 | 
			
		||||
		end,
 | 
			
		||||
	}, name)
 | 
			
		||||
	armor_inv:set_size("armor", 6)
 | 
			
		||||
	player_inv:set_size("armor", 6)
 | 
			
		||||
	if not armor:load_armor_inventory(player) and armor.migrate_old_inventory then
 | 
			
		||||
		local player_inv = player:get_inventory()
 | 
			
		||||
		player_inv:set_size("armor", 6)
 | 
			
		||||
		for i=1, 6 do
 | 
			
		||||
			local stack = player_inv:get_stack("armor", i)
 | 
			
		||||
			armor_inv:set_stack("armor", i, stack)
 | 
			
		||||
		end
 | 
			
		||||
		armor:save_armor_inventory(player)
 | 
			
		||||
		player_inv:set_size("armor", 0)
 | 
			
		||||
	end
 | 
			
		||||
	for i=1, 6 do
 | 
			
		||||
		local stack = player_inv:get_stack("armor", i)
 | 
			
		||||
		armor_inv:set_stack("armor", i, stack)
 | 
			
		||||
		local stack = armor_inv:get_stack("armor", i)
 | 
			
		||||
		armor:run_callbacks("on_equip", player, i, stack)
 | 
			
		||||
	end
 | 
			
		||||
	armor.def[name] = {
 | 
			
		||||
@@ -175,24 +174,13 @@ local function init_player_armor(player)
 | 
			
		||||
	for group, _ in pairs(armor.registered_groups) do
 | 
			
		||||
		armor.def[name].groups[group] = 0
 | 
			
		||||
	end
 | 
			
		||||
	local skin = armor:get_player_skin(name)
 | 
			
		||||
	armor.textures[name] = {
 | 
			
		||||
		skin = skin..".png",
 | 
			
		||||
		armor = "3d_armor_trans.png",
 | 
			
		||||
		wielditem = "3d_armor_trans.png",
 | 
			
		||||
		preview = armor.default_skin.."_preview.png",
 | 
			
		||||
		armor = "blank.png",
 | 
			
		||||
		wielditem = "blank.png",
 | 
			
		||||
	}
 | 
			
		||||
	local texture_path = minetest.get_modpath("player_textures")
 | 
			
		||||
	if texture_path then
 | 
			
		||||
		local dir_list = minetest.get_dir_list(texture_path.."/textures")
 | 
			
		||||
		for _, fn in pairs(dir_list) do
 | 
			
		||||
			if fn == "player_"..name..".png" then
 | 
			
		||||
				armor.textures[name].skin = fn
 | 
			
		||||
				break
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	armor:set_player_armor(player)
 | 
			
		||||
	minetest.after(0, function(player)
 | 
			
		||||
		armor:set_player_armor(player)
 | 
			
		||||
	end, player)
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@@ -201,9 +189,10 @@ end
 | 
			
		||||
default.player_register_model("3d_armor_character.b3d", {
 | 
			
		||||
	animation_speed = 30,
 | 
			
		||||
	textures = {
 | 
			
		||||
		armor.default_skin..".png",
 | 
			
		||||
		"3d_armor_trans.png",
 | 
			
		||||
		"3d_armor_trans.png",
 | 
			
		||||
		armor.default_skin,
 | 
			
		||||
		"blank.png",
 | 
			
		||||
		"blank.png",
 | 
			
		||||
		"blank.png",
 | 
			
		||||
	},
 | 
			
		||||
	animations = {
 | 
			
		||||
		stand = {x=0, y=79},
 | 
			
		||||
@@ -215,22 +204,6 @@ default.player_register_model("3d_armor_character.b3d", {
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	local name = armor:get_valid_player(player, "[on_player_receive_fields]")
 | 
			
		||||
	if not name then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	for field, _ in pairs(fields) do
 | 
			
		||||
		if string.find(field, "skins_set") then
 | 
			
		||||
			minetest.after(0, function(player)
 | 
			
		||||
				local skin = armor:get_player_skin(name)
 | 
			
		||||
				armor.textures[name].skin = skin..".png"
 | 
			
		||||
				armor:set_player_armor(player)
 | 
			
		||||
			end, player)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	default.player_set_model(player, "3d_armor_character.b3d")
 | 
			
		||||
	minetest.after(0, function(player)
 | 
			
		||||
@@ -251,13 +224,13 @@ end)
 | 
			
		||||
 | 
			
		||||
if armor.config.drop == true or armor.config.destroy == true then
 | 
			
		||||
	minetest.register_on_dieplayer(function(player)
 | 
			
		||||
		local name, player_inv = armor:get_valid_player(player, "[on_dieplayer]")
 | 
			
		||||
		local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]")
 | 
			
		||||
		if not name then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
		local drop = {}
 | 
			
		||||
		for i=1, player_inv:get_size("armor") do
 | 
			
		||||
			local stack = player_inv:get_stack("armor", i)
 | 
			
		||||
		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:set_inventory_stack(player, i, nil)
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B  | 
| 
		 Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 356 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B  | 
| 
		 Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 336 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 405 B  | 
| 
		 Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 355 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B  | 
| 
		 Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 356 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B  | 
| 
		 Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 356 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B  | 
| 
		 Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 336 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 368 B  | 
| 
		 Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 336 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 391 B  | 
| 
		 Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 347 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 389 B  | 
| 
		 Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 361 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B  | 
| 
		 Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B  | 
| 
		 Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 382 B  | 
| 
		 Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 520 B  | 
| 
		 Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 414 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B  | 
| 
		 Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 508 B  | 
| 
		 Before Width: | Height: | Size: 300 B After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B  | 
| 
		 Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 382 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 440 B  | 
| 
		 Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 382 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 493 B  | 
| 
		 Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 399 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 474 B  | 
| 
		 Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 407 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B  | 
| 
		 Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 469 B  | 
| 
		 Before Width: | Height: | Size: 253 B After Width: | Height: | Size: 352 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 184 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 431 B  | 
| 
		 Before Width: | Height: | Size: 185 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B  | 
| 
		 Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 426 B  | 
| 
		 Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 343 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 478 B  | 
| 
		 Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 350 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 473 B  | 
| 
		 Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 337 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 407 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 382 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 414 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B  | 
| 
		 Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 430 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 398 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 402 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 412 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 420 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 381 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 366 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 365 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 359 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 364 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 413 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 379 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B  | 
| 
		 Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 372 B  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 378 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 414 B  | 
| 
		 Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 406 B  | 
| 
		 Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 363 B  |