Knockback fixes:

This PR enables knockback for snowballs, and eggs.
And disables knockback for the following mobs: Shulkers, Iron Golems,
and Ender Dragons.
This commit is contained in:
MysticTempest 2022-06-07 02:55:19 -05:00
parent 61ddec5a85
commit 45ec876167
5 changed files with 30 additions and 28 deletions

View file

@ -3210,35 +3210,36 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
local die = false local die = false
-- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately.
if damage >= 0.1 then
-- weapon sounds if damage >= 0 then
if weapon:get_definition().sounds ~= nil then -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately.
if damage >= 0.1 then
-- weapon sounds
if weapon:get_definition().sounds ~= nil then
local s = random(0, #weapon:get_definition().sounds) local s = random(0, #weapon:get_definition().sounds)
minetest.sound_play(weapon:get_definition().sounds[s], { minetest.sound_play(weapon:get_definition().sounds[s], {
object = self.object, --hitter, object = self.object, --hitter,
max_hear_distance = 8 max_hear_distance = 8
}, true) }, true)
else else
minetest.sound_play("default_punch", { minetest.sound_play("default_punch", {
object = self.object, object = self.object,
max_hear_distance = 5 max_hear_distance = 5
}, true) }, true)
end
damage_effect(self, damage)
-- do damage
self.health = self.health - damage
-- skip future functions if dead, except alerting others
if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then
die = true
end
end end
damage_effect(self, damage)
-- do damage
self.health = self.health - damage
-- skip future functions if dead, except alerting others
if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then
die = true
end
-- knock back effect (only on full punch) -- knock back effect (only on full punch)
if not die if not die
and self.knock_back and self.knock_back

View file

@ -35,6 +35,7 @@ mcl_mobs:register_mob("mobs_mc:enderdragon", {
}, },
physical = true, physical = true,
damage = 10, damage = 10,
knock_back = false,
jump = true, jump = true,
jump_height = 14, jump_height = 14,
fly = true, fly = true,

View file

@ -37,6 +37,7 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
run_velocity = 1.2, run_velocity = 1.2,
-- Approximation -- Approximation
damage = 14, damage = 14,
knock_back = false,
reach = 3, reach = 3,
group_attack = true, group_attack = true,
attacks_monsters = true, attacks_monsters = true,

View file

@ -33,6 +33,7 @@ mcl_mobs:register_mob("mobs_mc:shulker", {
-- TODO: Make shulker dye-able -- TODO: Make shulker dye-able
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
walk_chance = 0, walk_chance = 0,
knock_back = false,
jump = false, jump = false,
drops = { drops = {
{name = "mcl_mobitems:shulker_shell", {name = "mcl_mobitems:shulker_shell",

View file

@ -61,11 +61,9 @@ local function check_object_hit(self, pos, dmg)
and entity.name ~= self.object:get_luaentity().name then and entity.name ~= self.object:get_luaentity().name then
if object:is_player() and self._thrower ~= object:get_player_name() then if object:is_player() and self._thrower ~= object:get_player_name() then
-- TODO: Deal knockback
self.object:remove() self.object:remove()
return true return true
elseif (entity.is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then elseif (entity.is_mob == true or entity._hittable_by_projectile) and (self._thrower ~= object) then
-- FIXME: Knockback is broken
object:punch(self.object, 1.0, { object:punch(self.object, 1.0, {
full_punch_interval = 1.0, full_punch_interval = 1.0,
damage_groups = dmg, damage_groups = dmg,
@ -185,7 +183,7 @@ local function egg_on_step(self, dtime)
end end
-- Destroy when hitting a mob or player (no chick spawning) -- Destroy when hitting a mob or player (no chick spawning)
if check_object_hit(self, pos) then if check_object_hit(self, pos, 0) then
minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true) minetest.sound_play("mcl_throwing_egg_impact", { pos = self.object:get_pos(), max_hear_distance=10, gain=0.5 }, true)
self.object:remove() self.object:remove()
return return