X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Farmor%2Finit.lua;h=a1daf8fe5285f6651110bd5c676bd71819f6be98;hb=c6434c98ae075c7f32bf7f07af00ecd72f218b4b;hp=567b83f13cb51cebc28f8c186b5194e6a4da11a1;hpb=f2d1e829250c6472a54f901dc9b2b0e6d4dcd0ed;p=Crafter.git diff --git a/mods/armor/init.lua b/mods/armor/init.lua index 567b83f..a1daf8f 100644 --- a/mods/armor/init.lua +++ b/mods/armor/init.lua @@ -1,44 +1,172 @@ function recalculate_armor(player) if not player or (player and not player:is_player()) then return end local inv = player:get_inventory() - local meta = player:get_meta() - local player_skin = meta:get_string("skin") + + local player_skin = minetest.get_skin(player) local armor_skin = "blank_skin.png" local stack = inv:get_stack("armor_head",1):get_name() - stack = stack:gsub("_item.png","") - stack = stack:gsub("armor:","") + if stack ~= "" and minetest.get_item_group(stack,"helmet") > 0 then + local skin_element = minetest.get_itemdef(stack, "wearing_texture") + player_skin = player_skin.."^"..skin_element + end + + stack = inv:get_stack("armor_torso",1):get_name() + if stack ~= "" and minetest.get_item_group(stack,"chestplate") > 0 then + local skin_element = minetest.get_itemdef(stack, "wearing_texture") + armor_skin = armor_skin.."^"..skin_element + end + + stack = inv:get_stack("armor_legs",1):get_name() + if stack ~= "" and minetest.get_item_group(stack,"leggings") > 0 then + local skin_element = minetest.get_itemdef(stack, "wearing_texture") + armor_skin = armor_skin.."^"..skin_element + end + + stack = inv:get_stack("armor_feet",1):get_name() + if stack ~= "" and minetest.get_item_group(stack,"boots") > 0 then + local skin_element = minetest.get_itemdef(stack, "wearing_texture") + armor_skin = armor_skin.."^"..skin_element + end + player:set_properties({textures = {player_skin,armor_skin}}) +end + +function calculate_armor_absorbtion(player) + if not player or (player and not player:is_player()) then return end + + local inv = player:get_inventory() + local armor_absorbtion = 0 + + local stack = inv:get_stack("armor_head",1):get_name() if stack ~= "" then - player_skin = player_skin.."^"..stack..".png" + local level = minetest.get_item_group(stack,"armor_level") + local defense = minetest.get_item_group(stack,"armor_defense") + armor_absorbtion = armor_absorbtion + (level*defense) end stack = inv:get_stack("armor_torso",1):get_name() - stack = stack:gsub("_item.png","") - stack = stack:gsub("armor:","") if stack ~= "" then - armor_skin = armor_skin.."^"..stack..".png" + local level = minetest.get_item_group(stack,"armor_level") + local defense = minetest.get_item_group(stack,"armor_defense") + armor_absorbtion = armor_absorbtion + (level*defense) end stack = inv:get_stack("armor_legs",1):get_name() - stack = stack:gsub("_item.png","") - stack = stack:gsub("armor:","") if stack ~= "" then - armor_skin = armor_skin.."^"..stack..".png" + local level = minetest.get_item_group(stack,"armor_level") + local defense = minetest.get_item_group(stack,"armor_defense") + armor_absorbtion = armor_absorbtion + (level*defense) end stack = inv:get_stack("armor_feet",1):get_name() - stack = stack:gsub("_item.png","") - stack = stack:gsub("armor:","") if stack ~= "" then - armor_skin = armor_skin.."^"..stack..".png" + local level = minetest.get_item_group(stack,"armor_level") + local defense = minetest.get_item_group(stack,"armor_defense") + armor_absorbtion = armor_absorbtion + (level*defense) end - player:set_properties({textures = {player_skin,armor_skin}}) + if armor_absorbtion > 0 then + armor_absorbtion = math.ceil(armor_absorbtion/4) + end + return(armor_absorbtion) +end + +function set_armor_gui(player) + if not player or (player and not player:is_player()) then return end + local meta = player:get_meta() + local level = calculate_armor_absorbtion(player) + local hud = meta:get_int("armor_bar") + player:hud_change(hud, "number", level) end -minetest.register_on_joinplayer(function(player) + +function damage_armor(player,damage) + if not player or (player and not player:is_player()) then return end + local inv = player:get_inventory() + + local recalc = false + + local stack = inv:get_stack("armor_head",1) + local name = stack:get_name() + if name ~= "" then + local wear_level = ((9-minetest.get_item_group(name,"armor_level"))*8)*(5-minetest.get_item_group(name,"armor_type"))*damage + stack:add_wear(wear_level) + inv:set_stack("armor_head", 1, stack) + local new_stack = inv:get_stack("armor_head",1):get_name() + if new_stack == "" then + recalc = true + end + end + + stack = inv:get_stack("armor_torso",1) + name = stack:get_name() + if name ~= "" then + local wear_level = ((9-minetest.get_item_group(name,"armor_level"))*4)*(5-minetest.get_item_group(name,"armor_type"))*damage + stack:add_wear(wear_level) + inv:set_stack("armor_torso", 1, stack) + local new_stack = inv:get_stack("armor_torso",1):get_name() + if new_stack == "" then + recalc = true + end + end + stack = inv:get_stack("armor_legs",1) + name = stack:get_name() + if name ~= "" then + local wear_level = ((9-minetest.get_item_group(name,"armor_level"))*6)*(5-minetest.get_item_group(name,"armor_type"))*damage + stack:add_wear(wear_level) + inv:set_stack("armor_legs", 1, stack) + local new_stack = inv:get_stack("armor_legs",1):get_name() + if new_stack == "" then + recalc = true + end + end + + stack = inv:get_stack("armor_feet",1) + name = stack:get_name() + if name ~= "" then + local wear_level = ((9-minetest.get_item_group(name,"armor_level"))*10)*(5-minetest.get_item_group(name,"armor_type"))*damage + stack:add_wear(wear_level) + inv:set_stack("armor_feet", 1, stack) + local new_stack = inv:get_stack("armor_feet",1):get_name() + if new_stack == "" then + recalc = true + end + end + + if recalc == true then + minetest.sound_play("armor_break",{to_player=player:get_player_name(),gain=1,pitch=math.random(80,100)/100}) + recalculate_armor(player) + set_armor_gui(player) + --do particles too + end +end + + +minetest.register_on_joinplayer(function(player) + local meta = player:get_meta() + player:hud_add({ + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "armor_icon_bg.png", + number = 20, + --direction = 1, + size = {x = 24, y = 24}, + offset = {x = (-10 * 24) - 25, y = -(48 + 50 + 39)}, + }) + local armor_bar = player:hud_add({ + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "armor_icon.png", + number = calculate_armor_absorbtion(player),--meta:get_int("hunger"), + --direction = 1, + size = {x = 24, y = 24}, + offset = {x = (-10 * 24) - 25, y = -(48 + 50 + 39)}, + }) + meta:set_int("armor_bar", armor_bar) + + local inv = player:get_inventory() inv:set_size("armor_head" ,1) inv:set_size("armor_torso",1) inv:set_size("armor_legs" ,1) @@ -49,11 +177,16 @@ minetest.register_on_joinplayer(function(player) end) end) +minetest.register_on_dieplayer(function(player) + set_armor_gui(player) +end) + minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) if inventory_info.from_list == "armor_head" or inventory_info.from_list == "armor_torso" or inventory_info.from_list == "armor_legs" or inventory_info.from_list == "armor_feet" or inventory_info.to_list == "armor_head" or inventory_info.to_list == "armor_torso" or inventory_info.to_list == "armor_legs" or inventory_info.to_list == "armor_feet" then minetest.after(0,function() recalculate_armor(player) + set_armor_gui(player) end) end end) @@ -87,8 +220,8 @@ minetest.register_allow_player_inventory_action(function(player, action, invento end end) -local armor_type = {["helmet"]=2,["chestplate"]=5,["leggings"]=3,["boots"]=2} -local materials = {["iron"]=2,["chain"]=4,["gold"]=3,["diamond"]=7} +local materials = {["iron"]=4,["chain"]=6,["gold"]=2,["diamond"]=8} --max 8 +local armor_type = {["helmet"]=2,["chestplate"]=4,["leggings"]=3,["boots"]=1} --max 4 local function bool_int(state) if state == true then return(1) end @@ -97,7 +230,7 @@ end for material_id,material in pairs(materials) do for armor_id,armor in pairs(armor_type) do - print(material_id,material,"|",armor_id,armor) + --print(material_id,material,"|",armor_id,armor) minetest.register_tool("armor:"..material_id.."_"..armor_id,{ description = material_id:gsub("^%l", string.upper).." "..armor_id:gsub("^%l", string.upper), @@ -112,6 +245,7 @@ for material_id,material in pairs(materials) do }, inventory_image = material_id.."_"..armor_id.."_item.png", stack_max = 1, + wearing_texture = material_id.."_"..armor_id..".png", tool_capabilities = { full_punch_interval = 0, max_drop_level = 0, @@ -160,6 +294,16 @@ for material_id,material in pairs(materials) do {"main:"..material_id, "", "main:"..material_id} } }) + minetest.register_node("armor:"..material_id.."_"..armor_id.."particletexture", { + description = "NIL", + tiles = {material_id.."_"..armor_id.."_item.png"}, + groups = {}, + drop = "", + drawtype = "allfaces", + on_construct = function(pos) + minetest.remove_node(pos) + end, + }) end end