2021-04-21 02:19:55 +02:00
|
|
|
local vector_direction = vector.direction
|
|
|
|
local minetest_dir_to_yaw = minetest.dir_to_yaw
|
|
|
|
local vector_distance = vector.distance
|
|
|
|
|
|
|
|
|
|
|
|
mobs.explode_attack_walk = function(self,dtime)
|
|
|
|
|
|
|
|
--this needs an exception
|
|
|
|
if self.attacking == nil or not self.attacking:is_player() then
|
|
|
|
self.attacking = nil
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
mobs.set_yaw_while_attacking(self)
|
|
|
|
|
|
|
|
--make mob walk up to player within 2 nodes distance then start exploding
|
|
|
|
if vector_distance(self.object:get_pos(), self.attacking:get_pos()) >= self.reach then
|
|
|
|
mobs.set_velocity(self, self.run_velocity)
|
|
|
|
mobs.set_mob_animation(self,"run")
|
|
|
|
|
|
|
|
mobs.reverse_explosion_animation(self,dtime)
|
|
|
|
else
|
|
|
|
mobs.set_velocity(self,0)
|
|
|
|
|
|
|
|
--this is the only way I can reference this without dumping extra data on all mobs
|
|
|
|
if not self.explosion_animation then
|
|
|
|
self.explosion_animation = 0
|
|
|
|
end
|
2021-04-21 03:34:18 +02:00
|
|
|
|
|
|
|
--play ignite sound
|
|
|
|
if self.explosion_animation == 0 then
|
|
|
|
mobs.play_sound(self,"attack")
|
|
|
|
end
|
|
|
|
|
2021-04-21 02:19:55 +02:00
|
|
|
mobs.set_mob_animation(self,"stand")
|
|
|
|
|
|
|
|
mobs.handle_explosion_animation(self)
|
|
|
|
|
2021-04-21 02:43:45 +02:00
|
|
|
self.explosion_animation = self.explosion_animation + (dtime/2)
|
2021-04-21 03:00:36 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
--make explosive mobs jump
|
|
|
|
--check for nodes to jump over
|
|
|
|
--explosive mobs will just ride against walls for now
|
|
|
|
local node_in_front_of = mobs.jump_check(self)
|
|
|
|
if node_in_front_of == 1 then
|
|
|
|
mobs.jump(self)
|
2021-04-21 02:19:55 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
--do biggening explosion thing
|
|
|
|
if self.explosion_animation and self.explosion_animation > self.explosion_timer then
|
2021-04-21 02:43:45 +02:00
|
|
|
mcl_explosions.explode(self.object:get_pos(), self.explosion_strength,{ drop_chance = 1.0 })
|
2021-04-21 02:19:55 +02:00
|
|
|
self.object:remove()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
--this is a small helper function to make working with explosion animations easier
|
|
|
|
mobs.reverse_explosion_animation = function(self,dtime)
|
|
|
|
|
|
|
|
|
|
|
|
--if explosion animation was greater than 0 then reverse it
|
|
|
|
if self.explosion_animation ~= nil and self.explosion_animation > 0 then
|
|
|
|
self.explosion_animation = self.explosion_animation - dtime
|
|
|
|
if self.explosion_animation < 0 then
|
|
|
|
self.explosion_animation = 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
mobs.handle_explosion_animation(self)
|
|
|
|
end
|