From 2e6610da420c3767c8ee9851933eccb8ac3c95fd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 17 Feb 2020 19:55:02 +0100 Subject: [PATCH] Overhaul armor protection formula --- .../minetest-3d_armor/3d_armor/armor.lua | 66 ++++++++++++------- .../ITEMS/minetest-3d_armor/3d_armor/init.lua | 40 +++++------ 2 files changed, 63 insertions(+), 43 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index 793eda4e4..4d1eb0a42 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -79,7 +79,6 @@ elseif minetest.get_modpath("wardrobe") then end armor.def = { - state = 0, count = 0, } @@ -104,11 +103,10 @@ armor.set_player_armor = function(self, player) end local armor_texture = "blank.png" local armor_level = 0 - local armor_heal = 0 + local mcl_armor_points = 0 local armor_fire = 0 local armor_water = 0 local armor_radiation = 0 - local state = 0 local items = 0 local elements = {} local textures = {} @@ -131,9 +129,8 @@ armor.set_player_armor = function(self, player) table.insert(textures, texture..".png") preview = preview.."^"..texture.."_preview.png" armor_level = armor_level + level - state = state + stack:get_wear() items = items + 1 - armor_heal = armor_heal + (def.groups["armor_heal"] or 0) + mcl_armor_points = mcl_armor_points + (def.groups["mcl_armor_points"] or 0) armor_fire = armor_fire + (def.groups["armor_fire"] or 0) armor_water = armor_water + (def.groups["armor_water"] or 0) armor_radiation = armor_radiation + (def.groups["armor_radiation"] or 0) @@ -164,7 +161,7 @@ armor.set_player_armor = function(self, player) armor_level = armor_level * 1.1 end armor_level = armor_level * ARMOR_LEVEL_MULTIPLIER - armor_heal = armor_heal * ARMOR_HEAL_MULTIPLIER + mcl_armor_points = mcl_armor_points * ARMOR_HEAL_MULTIPLIER armor_radiation = armor_radiation * ARMOR_RADIATION_MULTIPLIER if #textures > 0 then armor_texture = table.concat(textures, "^") @@ -182,10 +179,9 @@ armor.set_player_armor = function(self, player) -- Physics override intentionally removed because of possible conflicts self.textures[name].armor = armor_texture self.textures[name].preview = preview - self.def[name].state = state self.def[name].count = items self.def[name].level = armor_level - self.def[name].heal = armor_heal + self.def[name].heal = mcl_armor_points self.def[name].jump = physics_o.jump self.def[name].speed = physics_o.speed self.def[name].gravity = physics_o.gravity @@ -200,6 +196,24 @@ armor.update_armor = function(self, player) -- Other mods can hook on to this function, see hud mod for example end +armor.get_armor_points = function(self, player) + local name, player_inv, armor_inv = armor:get_valid_player(player, "[get_armor_points]") + if not name then + return nil + end + local pts = 0 + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + if stack:get_count() > 0 then + local p = stack:get_definition().groups.mcl_armor_points + if p then + pts = pts + p + end + end + end + return pts +end + armor.get_player_skin = function(self, name) local skin = nil if skin_mod == "mcl_skins" then @@ -232,7 +246,7 @@ armor.get_armor_formspec = function(self, name) local formspec = armor.formspec.."list[detached:"..name.."_armor;armor;0,1;2,3;]" formspec = formspec:gsub("armor_preview", armor.textures[name].preview) formspec = formspec:gsub("armor_level", armor.def[name].level) - formspec = formspec:gsub("armor_heal", armor.def[name].heal) + formspec = formspec:gsub("mcl_armor_points", armor.def[name].heal) formspec = formspec:gsub("armor_fire", armor.def[name].fire) formspec = formspec:gsub("armor_radiation", armor.def[name].radiation) return formspec @@ -370,7 +384,6 @@ minetest.register_on_joinplayer(function(player) armor_inv:set_stack("armor", i, stack) end armor.def[name] = { - state = 0, count = 0, level = 0, heal = 0, @@ -490,45 +503,52 @@ minetest.register_on_player_hpchange(function(player, hp_change, reason) local name, player_inv, armor_inv = armor:get_valid_player(player, "[on_hpchange]") if name and hp_change < 0 then - -- Armor doesn't protect from set_hp (commands like /kill) - -- and drowning damage. - if reason.type == "set_hp" or reason.type == "drown" then + -- Armor doesn't protect from set_hp (commands like /kill), + -- falling and drowning damage. + if reason.type == "set_hp" or reason.type == "drown" or reason.type == "fall" then return hp_change end local heal_max = 0 - local state = 0 local items = 0 local armor_damage = math.max(1, math.floor(math.abs(hp_change)/4)) + + local total_points = 0 + local total_toughness = 0 for i=1, 6 do local stack = player_inv:get_stack("armor", i) if stack:get_count() > 0 then -- Damage armor - local use = stack:get_definition().groups["armor_use"] or 0 + local use = stack:get_definition().groups["mcl_armor_uses"] or 0 if use > 0 then local wear = armor_damage * math.floor(65536/use) stack:add_wear(wear) end local item = stack:get_name() - local heal = stack:get_definition().groups["armor_heal"] or 0 armor_inv:set_stack("armor", i, stack) player_inv:set_stack("armor", i, stack) - state = state + stack:get_wear() items = items + 1 if stack:get_count() == 0 then armor:set_player_armor(player) armor:update_inventory(player) end - heal_max = heal_max + heal + + local pts = stack:get_definition().groups["mcl_armor_points"] or 0 + local tough = stack:get_definition().groups["mcl_armor_toughness"] or 0 + total_points = total_points + pts + total_toughness = total_toughness + tough end end - armor.def[name].state = state + local damage = math.abs(hp_change) + + -- Damage calculation formula (from ) + damage = damage * (1 - math.min(20, math.max((total_points/5), total_points - damage / (2+(total_toughness/4)))) / 25) + damage = math.floor(damage+0.5) + + hp_change = -math.abs(damage) + armor.def[name].count = items - heal_max = heal_max * ARMOR_HEAL_MULTIPLIER - if heal_max > math.random(100) then - hp_change = 0 - end armor:update_armor(player) end return hp_change diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua index ee0b74f79..f3b28177c 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua @@ -12,7 +12,7 @@ minetest.register_tool("3d_armor:helmet_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_leather.png", - groups = {armor_head=5, armor_heal=0, armor_use=56}, + groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56}, _repair_material = "mcl_mobitems:leather", }) @@ -21,7 +21,7 @@ minetest.register_tool("3d_armor:helmet_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_iron.png", - groups = {armor_head=10, armor_heal=5, armor_use=166}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, _repair_material = "mcl_core:iron_ingot", }) @@ -30,7 +30,7 @@ minetest.register_tool("3d_armor:helmet_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_gold.png", - groups = {armor_head=15, armor_heal=10, armor_use=78}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78}, _repair_material = "mcl_core:gold_ingot", }) @@ -39,7 +39,7 @@ minetest.register_tool("3d_armor:helmet_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_diamond.png", - groups = {armor_head=20, armor_heal=15, armor_use=364}, + groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2}, _repair_material = "mcl_core:diamond", }) @@ -48,7 +48,7 @@ minetest.register_tool("3d_armor:helmet_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_helmet_chain.png", - groups = {armor_head=15, armor_heal=10, armor_use=166}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, _repair_material = "mcl_core:iron_ingot", }) @@ -59,7 +59,7 @@ minetest.register_tool("3d_armor:chestplate_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_leather.png", - groups = {armor_torso=15, armor_heal=0, armor_use=81}, + groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81}, _repair_material = "mcl_mobitems:leather", }) @@ -68,7 +68,7 @@ minetest.register_tool("3d_armor:chestplate_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_iron.png", - groups = {armor_torso=20, armor_heal=5, armor_use=241}, + groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241}, _repair_material = "mcl_core:iron_ingot", }) @@ -77,7 +77,7 @@ minetest.register_tool("3d_armor:chestplate_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_gold.png", - groups = {armor_torso=25, armor_heal=10, armor_use=113}, + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113}, _repair_material = "mcl_core:gold_ingot", }) @@ -86,7 +86,7 @@ minetest.register_tool("3d_armor:chestplate_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_diamond.png", - groups = {armor_torso=30, armor_heal=15, armor_use=529}, + groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2}, _repair_material = "mcl_core:diamond", }) @@ -95,7 +95,7 @@ minetest.register_tool("3d_armor:chestplate_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_chestplate_chain.png", - groups = {armor_torso=25, armor_heal=10, armor_use=241}, + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241}, _repair_material = "mcl_core:iron_ingot", }) @@ -106,7 +106,7 @@ minetest.register_tool("3d_armor:leggings_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_leather.png", - groups = {armor_legs=10, armor_heal=0, armor_use=76}, + groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76}, _repair_material = "mcl_mobitems:leather", }) @@ -115,7 +115,7 @@ minetest.register_tool("3d_armor:leggings_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_iron.png", - groups = {armor_legs=15, armor_heal=5, armor_use=226}, + groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226}, _repair_material = "mcl_core:iron_ingot", }) @@ -124,7 +124,7 @@ minetest.register_tool("3d_armor:leggings_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_gold.png", - groups = {armor_legs=20, armor_heal=10, armor_use=106}, + groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106}, _repair_material = "mcl_core:gold_ingot", }) @@ -133,7 +133,7 @@ minetest.register_tool("3d_armor:leggings_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_diamond.png", - groups = {armor_legs=25, armor_heal=15, armor_use=496}, + groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2}, _repair_material = "mcl_core:diamond", }) @@ -142,7 +142,7 @@ minetest.register_tool("3d_armor:leggings_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_chain.png", - groups = {armor_legs=20, armor_heal=10, armor_use=226}, + groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226}, _repair_material = "mcl_core:iron_ingot", }) -- Regisiter Boots @@ -152,7 +152,7 @@ minetest.register_tool("3d_armor:boots_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_leather.png", - groups = {armor_feet=5, armor_heal=0, armor_use=66}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66}, _repair_material = "mcl_mobitems:leather", }) @@ -161,7 +161,7 @@ minetest.register_tool("3d_armor:boots_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_iron.png", - groups = {armor_feet=10, armor_heal=5, armor_use=196}, + groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196}, _repair_material = "mcl_core:iron_ingot", }) @@ -170,7 +170,7 @@ minetest.register_tool("3d_armor:boots_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_gold.png", - groups = {armor_feet=15, armor_heal=10, armor_use=92}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92}, _repair_material = "mcl_core:gold_ingot", }) @@ -179,7 +179,7 @@ minetest.register_tool("3d_armor:boots_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_diamond.png", - groups = {armor_feet=20, armor_heal=15, armor_use=430}, + groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2}, _repair_material = "mcl_core:diamond", }) @@ -188,7 +188,7 @@ minetest.register_tool("3d_armor:boots_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_boots_chain.png", - groups = {armor_feet=15, armor_heal=10, armor_use=196}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196}, _repair_material = "mcl_core:iron_ingot", })