mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-12-26 09:59:33 +01:00
Overhaul armor protection formula
This commit is contained in:
parent
988ca6ffe7
commit
2e6610da42
2 changed files with 63 additions and 43 deletions
|
@ -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 <https://minecraft.gamepedia.com/Armor#Damage_protection>)
|
||||
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
|
||||
|
|
|
@ -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",
|
||||
})
|
||||
|
||||
|
|
Loading…
Reference in a new issue