Wither melee attack and bug fixes

This commit is contained in:
the-real-herowl 2023-10-08 18:59:21 +02:00 committed by the-real-herowl
parent 924a6c1c47
commit 645072507f
2 changed files with 51 additions and 15 deletions

View File

@ -11,6 +11,7 @@ local w_strafes = minetest.settings:get_bool("wither_strafes", true)
local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false) local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false)
local WITHER_INIT_BOOM = 7 local WITHER_INIT_BOOM = 7
local WITHER_MELEE_COOLDOWN = 3
local function atan(x) local function atan(x)
if not x or x ~= x then if not x or x ~= x then
@ -48,9 +49,8 @@ local function wither_unstuck(self)
end end
end end
end end end end end end
else -- when mobs_griefing disabled, make a small nondestructive explosion
mcl_mobs.mob_class.safe_boom(self, pos, 2)
end end
mcl_mobs.mob_class.safe_boom(self, pos, 2)
end end
mobs_mc.wither_count_overworld = 0 mobs_mc.wither_count_overworld = 0
@ -105,7 +105,7 @@ mcl_mobs.register_mob("mobs_mc:wither", {
dogshoot_stop = true, dogshoot_stop = true,
arrow = "mobs_mc:wither_skull", arrow = "mobs_mc:wither_skull",
reach = 5, reach = 5,
shoot_interval = 0.5, shoot_interval = 1,
shoot_offset = -0.5, shoot_offset = -0.5,
animation = { animation = {
walk_speed = 12, run_speed = 12, stand_speed = 12, walk_speed = 12, run_speed = 12, stand_speed = 12,
@ -306,6 +306,42 @@ mcl_mobs.register_mob("mobs_mc:wither", {
if rand_pos == 1 then m = sr if rand_pos == 1 then m = sr
elseif rand_pos == 2 then m = sl end elseif rand_pos == 2 then m = sl end
-- melee attack
if not self._melee_timer then
self._melee_timer = 0
end
if self._melee_timer < WITHER_MELEE_COOLDOWN then
self._melee_timer = self._melee_timer + dtime
else
self._melee_timer = 0
local pos = table.copy(s)
pos.y = pos.y + 2
local objs = minetest.get_objects_inside_radius(pos, self.reach)
local obj_pos, dist
local hit_some = false
for n = 1, #objs do
objs[n]:punch(objs[n], 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 4},
}, pos)
local ent = objs[n]:get_luaentity()
if objs[n]:is_player() or ent then
mcl_util.deal_damage(objs[n], 8, {type = "magic"})
hit_some = true
end
mcl_mobs.effect_functions["withering"](objs[n], 0.5, 10)
end
if hit_some then
mcl_mobs.effect(pos, 32, "mcl_particles_soul_fire_flame.png", 5, 10, self.reach, 1, 0)
end
end
if dist < self.reach then
self.shoot_interval = 3
else
self.shoot_interval = 1
end
if self.shoot_interval if self.shoot_interval
and self.timer > self.shoot_interval and self.timer > self.shoot_interval
and not minetest.raycast(vector.add(m, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next() and not minetest.raycast(vector.add(m, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next()

View File

@ -730,7 +730,7 @@ end
function mcl_potions.healing_func(player, hp) function mcl_potions.healing_func(player, hp)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local obj = player:get_luaentity() local obj = player:get_luaentity()
@ -760,7 +760,7 @@ end
function mcl_potions.swiftness_func(player, factor, duration) function mcl_potions.swiftness_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -793,7 +793,7 @@ end
function mcl_potions.leaping_func(player, factor, duration) function mcl_potions.leaping_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -826,7 +826,7 @@ end
function mcl_potions.weakness_func(player, factor, duration) function mcl_potions.weakness_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -854,7 +854,7 @@ end
function mcl_potions.strength_func(player, factor, duration) function mcl_potions.strength_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -882,7 +882,7 @@ end
function mcl_potions.withering_func(player, factor, duration) function mcl_potions.withering_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and (entity.is_boss or string.find(entity.name, "wither")) then return false end if entity and (entity.is_boss or string.find(entity.name, "wither")) then return false end
@ -910,7 +910,7 @@ end
function mcl_potions.poison_func(player, factor, duration) function mcl_potions.poison_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and (entity.is_boss or entity.harmed_by_heal or string.find(entity.name, "spider")) then return false end if entity and (entity.is_boss or entity.harmed_by_heal or string.find(entity.name, "spider")) then return false end
@ -938,7 +938,7 @@ end
function mcl_potions.regeneration_func(player, factor, duration) function mcl_potions.regeneration_func(player, factor, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and (entity.is_boss or entity.harmed_by_heal) then return false end if entity and (entity.is_boss or entity.harmed_by_heal) then return false end
@ -966,7 +966,7 @@ end
function mcl_potions.invisiblility_func(player, null, duration) function mcl_potions.invisiblility_func(player, null, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -993,7 +993,7 @@ end
function mcl_potions.water_breathing_func(player, null, duration) function mcl_potions.water_breathing_func(player, null, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -1020,7 +1020,7 @@ end
function mcl_potions.fire_resistance_func(player, null, duration) function mcl_potions.fire_resistance_func(player, null, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end
@ -1046,7 +1046,7 @@ end
function mcl_potions.night_vision_func(player, null, duration) function mcl_potions.night_vision_func(player, null, duration)
if player:get_hp() <= 0 then return false end if not player or player:get_hp() <= 0 then return false end
local entity = player:get_luaentity() local entity = player:get_luaentity()
if entity and entity.is_boss then return false end if entity and entity.is_boss then return false end