]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/armor/init.lua
Inventory UI improvements
[Crafter.git] / mods / armor / init.lua
index 57df99d7358a7742a420422b4afb7e2653e5dc2e..4062328284d6dd95491dc894e47846b8a5921afe 100644 (file)
-function recalculate_armor(player)
+local
+minetest,math,pairs
+=
+minetest,math,pairs
+
+local get_item_group = minetest.get_item_group
+local get_itemdef    = minetest.get_itemdef
+
+
+local ceil  = math.ceil
+local random = math.random
+
+local inv
+local player_skin
+local armor_skin
+local stack
+local skin_element
+function recalculate_armor(player, reload_inv)
+    
     if not player or (player and not player:is_player()) then return end
-    local inv = player:get_inventory()
 
-    local player_skin = get_skin(player)
-    local armor_skin = "blank_skin.png"
+    inv = player:get_inventory()
+
+    player_skin = get_skin(player)
+    armor_skin = "blank_skin.png"
 
-    local stack = inv:get_stack("armor_head",1):get_name()
-    if stack ~= "" and minetest.get_item_group(stack,"helmet") > 0 then
-        local skin_element = minetest.get_itemdef(stack, "wearing_texture")
+    stack = inv:get_stack("armor_head",1):get_name()
+    if stack ~= "" and get_item_group(stack,"helmet") > 0 then
+        skin_element = 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")
+    if stack ~= "" and get_item_group(stack,"chestplate") > 0 then
+        skin_element = 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")
+    if stack ~= "" and get_item_group(stack,"leggings") > 0 then
+        skin_element = 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")
+    if stack ~= "" and get_item_group(stack,"boots") > 0 then
+        skin_element = get_itemdef(stack, "wearing_texture")
         armor_skin = armor_skin.."^"..skin_element
     end
     player:set_properties({textures = {player_skin,armor_skin}})
+    
+    if reload_inv then
+               inventory.reload(player)
+       else
+               inventory.set(player)
+       end
 end
 
+local inv
+local armor_absorbtion
+local level
+local defense
+local stack
 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
+    inv = player:get_inventory()
+    armor_absorbtion = 0
 
-    local stack = inv:get_stack("armor_head",1):get_name()
+    stack = inv:get_stack("armor_head",1):get_name()
     if stack ~= "" then
-        local level = minetest.get_item_group(stack,"armor_level")
-        local defense = minetest.get_item_group(stack,"armor_defense")
+        level = get_item_group(stack,"armor_level")
+        defense = get_item_group(stack,"armor_defense")
         armor_absorbtion = armor_absorbtion + (level*defense)
     end
 
     stack = inv:get_stack("armor_torso",1):get_name()
     if stack ~= "" then
-        local level = minetest.get_item_group(stack,"armor_level")
-        local defense = minetest.get_item_group(stack,"armor_defense")
+        level = get_item_group(stack,"armor_level")
+        defense = get_item_group(stack,"armor_defense")
         armor_absorbtion = armor_absorbtion + (level*defense)
     end
 
     stack = inv:get_stack("armor_legs",1):get_name()
     if stack ~= "" then
-        local level = minetest.get_item_group(stack,"armor_level")
-        local defense = minetest.get_item_group(stack,"armor_defense")
+        level = get_item_group(stack,"armor_level")
+        defense = get_item_group(stack,"armor_defense")
         armor_absorbtion = armor_absorbtion + (level*defense)
     end
 
     stack = inv:get_stack("armor_feet",1):get_name()
     if stack ~= "" then
-        local level = minetest.get_item_group(stack,"armor_level")
-        local defense = minetest.get_item_group(stack,"armor_defense")
+        level = get_item_group(stack,"armor_level")
+        defense = get_item_group(stack,"armor_defense")
         armor_absorbtion = armor_absorbtion + (level*defense)
     end
     if armor_absorbtion > 0 then
-        armor_absorbtion = math.ceil(armor_absorbtion/4)
+        armor_absorbtion = ceil(armor_absorbtion/4)
     end
     return(armor_absorbtion)
 end
 
+local level
 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)
+    level = calculate_armor_absorbtion(player)
+    hud_manager.change_hud({
+               player    =  player ,
+               hud_name  = "armor_fg",
+               element   = "number",
+               data      =  level
+       })
 end
 
 
+local inv
+local recalc
+local stack
+local name
+local wear_level
+local new_stack
 
 function damage_armor(player,damage)
     if not player or (player and not player:is_player()) then return end
 
-    local inv = player:get_inventory()
+    inv = player:get_inventory()
     
-    local recalc = false
+    recalc = false
 
-    local stack = inv:get_stack("armor_head",1)
-    local name = stack:get_name()
+    stack = inv:get_stack("armor_head",1)
+    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
+        wear_level = ((9-get_item_group(name,"armor_level"))*8)*(5-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()
+        new_stack = inv:get_stack("armor_head",1):get_name()
         if new_stack == "" then
             recalc = true
         end
@@ -102,10 +142,10 @@ function damage_armor(player,damage)
     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
+        wear_level = ((9-get_item_group(name,"armor_level"))*4)*(5-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()
+        new_stack = inv:get_stack("armor_torso",1):get_name()
         if new_stack == "" then
             recalc = true
         end
@@ -114,10 +154,10 @@ function damage_armor(player,damage)
     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
+        wear_level = ((9-get_item_group(name,"armor_level"))*6)*(5-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()
+        new_stack = inv:get_stack("armor_legs",1):get_name()
         if new_stack == "" then
             recalc = true
         end
@@ -126,101 +166,100 @@ function damage_armor(player,damage)
     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
+        wear_level = ((9-get_item_group(name,"armor_level"))*10)*(5-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()
+        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})
+        minetest.sound_play("armor_break",{to_player=player:get_player_name(),gain=1,pitch=random(80,100)/100})
         recalculate_armor(player)
         set_armor_gui(player)
         --do particles too
     end
 end
 
-
+local inv
 minetest.register_on_joinplayer(function(player)
-    local meta = player:get_meta()
-       player:hud_add({
+       hud_manager.add_hud(player,"armor_bg",{
                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_manager.add_hud(player,"armor_fg",{
                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,
+               number = calculate_armor_absorbtion(player),
                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 = player:get_inventory()
     inv:set_size("armor_head" ,1)
     inv:set_size("armor_torso",1)
     inv:set_size("armor_legs" ,1)
     inv:set_size("armor_feet" ,1)
-
-    minetest.after(0.1,function()
-        recalculate_armor(player)
-    end)
 end)
 
 minetest.register_on_dieplayer(function(player)
     set_armor_gui(player)
 end)
 
+local acceptable = {
+    ["armor_head"]  = true,
+    ["armor_torso"] = true,
+    ["armor_legs"]  = true,
+    ["armor_feet"]  = true,
+}
 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
+    if acceptable[inventory_info.from_list] or acceptable[inventory_info.to_list] then
         minetest.after(0,function()
-            recalculate_armor(player)
+            recalculate_armor(player, true)
             set_armor_gui(player)
         end)
     end
 end)
 
 --only allow players to put armor in the right slots to stop exploiting chestplates
+local stack
+local item
 minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info)
     if inventory_info.to_list == "armor_head" then
-        local stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
-        local item = stack:get_name()
-        if minetest.get_item_group(item, "helmet") == 0 then
+        stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
+        item = stack:get_name()
+        if get_item_group(item, "helmet") == 0 then
             return(0)
         end
     elseif inventory_info.to_list == "armor_torso" then
-        local stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
-        local item = stack:get_name()
-        if minetest.get_item_group(item, "chestplate") == 0 then
+        stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
+        item = stack:get_name()
+        if get_item_group(item, "chestplate") == 0 then
             return(0)
         end
     elseif inventory_info.to_list == "armor_legs" then
-        local stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
-        local item = stack:get_name()
-        if minetest.get_item_group(item, "leggings") == 0 then
+        stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
+        item = stack:get_name()
+        if get_item_group(item, "leggings") == 0 then
             return(0)
         end
     elseif inventory_info.to_list == "armor_feet" then
-        local stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
-        local item = stack:get_name()
-        if minetest.get_item_group(item, "boots") == 0 then
+        stack = inventory:get_stack(inventory_info.from_list,inventory_info.from_index)
+        item = stack:get_name()
+        if get_item_group(item, "boots") == 0 then
             return(0)
         end
     end
 end)
 
-local materials = {["iron"]=4,["chain"]=6,["gold"]=2,["diamond"]=8} --max 8
+local materials = {["coal"]=1,["lapis"]=2,["iron"]=3,["chain"]=4,["gold"]=2,["diamond"]=5,["emerald"]=6,["sapphire"]=7,["ruby"]=8} --max 8
 local armor_type = {["helmet"]=2,["chestplate"]=4,["leggings"]=3,["boots"]=1} --max 4
 
 local function bool_int(state)
@@ -307,4 +346,4 @@ for material_id,material in pairs(materials) do
         end
         
     end
-end
\ No newline at end of file
+end