]> git.lizzy.rs Git - Crafter.git/commitdiff
Implement armor defense and make mobs more powerful
authoroilboi <47129783+oilboi@users.noreply.github.com>
Sun, 31 May 2020 03:20:50 +0000 (23:20 -0400)
committeroilboi <47129783+oilboi@users.noreply.github.com>
Sun, 31 May 2020 03:20:50 +0000 (23:20 -0400)
mods/armor/init.lua
mods/armor/sounds/armor_break.ogg [new file with mode: 0644]
mods/armor/sounds/attributes.txt.txt [new file with mode: 0644]
mods/mob/api/api_hook.lua
mods/mob/api/interaction.lua
mods/mob/init.lua
mods/player/player_interaction.lua

index b91de9ecbd967d01cb1c2a1f12ce9c56f0332835..fcdc2bae7e13da1413f8af0e33bddafaae37ce1a 100644 (file)
@@ -35,6 +35,107 @@ function recalculate_armor(player)
     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
+        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()
+    if stack ~= "" then
+        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()
+    if stack ~= "" then
+        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()
+    if stack ~= "" then
+        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
+    if armor_absorbtion > 0 then
+        armor_absorbtion = math.ceil(armor_absorbtion/4)
+    end
+    print(armor_absorbtion)
+    return(armor_absorbtion)
+end
+
+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)
+        --do particles too
+    end
+end
 
 minetest.register_on_joinplayer(function(player)
     local inv = player:get_inventory()
@@ -87,8 +188,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
diff --git a/mods/armor/sounds/armor_break.ogg b/mods/armor/sounds/armor_break.ogg
new file mode 100644 (file)
index 0000000..2b2eb58
Binary files /dev/null and b/mods/armor/sounds/armor_break.ogg differ
diff --git a/mods/armor/sounds/attributes.txt.txt b/mods/armor/sounds/attributes.txt.txt
new file mode 100644 (file)
index 0000000..30c3922
--- /dev/null
@@ -0,0 +1 @@
+armor_break - https://freesound.org/people/RutgerMuller/sounds/51044/
\ No newline at end of file
index 41be2442ee468c525f68ac106488d9db96020101..6a3c36034473b8788e0a145f68086624802d8eb4 100644 (file)
@@ -104,7 +104,7 @@ mob_register.custom_function_end = def.custom_function_end
 
 mob_register.projectile_timer_cooldown = def.projectile_timer_cooldown
 mob_register.attacked_hostile = def.attacked_hostile
-
+mob_register.attack_damage = def.attack_damage
 
 mob_register.projectile_timer = 0
 mob_register.projectile_type = def.projectile_type
index 5d257c01c265dbc27d2a5c68c3d8f69605cb2702..695c4760708b8b2772fbdb6af778acb03124f5c2 100644 (file)
@@ -277,11 +277,10 @@ mobs.create_interaction_functions = function(def,mob_register)
                        local light_level = minetest.get_node_light(pos)
                        if light_level then
                                if (self.die_in_light == true and light_level > self.die_in_light_level) then
-                                       local damage = self.hp
                                        self.object:punch(self.object, 2, 
                                                {
                                                full_punch_interval=1.5,
-                                               damage_groups = {damage=damage},
+                                               damage_groups = {damage=2},
                                        })
                                end
                        end
@@ -318,7 +317,7 @@ mobs.create_interaction_functions = function(def,mob_register)
                                                                object:punch(self.object, 2, 
                                                                        {
                                                                        full_punch_interval=1.5,
-                                                                       damage_groups = {damage=2},
+                                                                       damage_groups = {damage=self.attack_damage},
                                                                },vector.direction(pos,pos2))
                                                        end
                                                end
index 9f75b752a77fce4da4fa089316067fa108227cf2..cf7cc636cb961d800fa228d36d575fa79bd94e7a 100644 (file)
@@ -320,6 +320,7 @@ mobs.register_mob(
        hurt_sound = "slime_die",
        die_sound = "slime_die",
        attack_type = "punch",
+       attack_damage = 10,
        custom_on_death = function(self)
                local pos = self.object:get_pos()
                for i = 1,4 do
@@ -357,6 +358,7 @@ mobs.register_mob(
        death_rotation = "z",
        hurt_sound = "slime_die",
        die_sound = "slime_die",
+       attack_damage = 5,
        attack_type = "punch",
        custom_on_death = function(self)
                local pos = self.object:get_pos()
@@ -396,6 +398,7 @@ mobs.register_mob(
        death_rotation = "z",
        hurt_sound = "slime_die",
        die_sound = "slime_die",
+       attack_damage = 2,
        attack_type = "punch",
        item_drop = "mob:slimeball"
        }
@@ -651,6 +654,7 @@ mobs.register_mob(
         hostile = true,
         friendly_in_daylight = true,
         attacked_hostile = true,
+        attack_damage = 8,
         attack_type = "punch",
         group_attack = true,
 
index 2b7b4005b549bd95da79edbde78cae02e4ba2809..17e329b51bc75f28552bb7b441d8a86917a89234 100644 (file)
@@ -3,10 +3,18 @@ minetest.register_on_player_hpchange(function(player, hp_change, reason)
        if reason.type == "fall" then
                if minetest.get_item_group(minetest.get_node(player:get_pos()).name, "disable_fall_damage") > 0 then
                        return(0)
+               else
+                       minetest.sound_play("hurt", {object=player, gain = 1.0, max_hear_distance = 60,pitch = math.random(80,100)/100})
                end
-       end
-       if hp_change < 0 then
+       elseif hp_change < 0 then
+               local hp_modifier = math.ceil(calculate_armor_absorbtion(player)/2)
+               damage_armor(player,math.abs(hp_change))
+               hp_change = hp_change + hp_modifier
                minetest.sound_play("hurt", {object=player, gain = 1.0, max_hear_distance = 60,pitch = math.random(80,100)/100})
+
+               if hp_change >= 0 then
+                       hp_change = -1
+               end
        end
        return(hp_change)
 end, true)