Redo the death effect
This commit is contained in:
parent
411e180477
commit
ed3afc6e49
10 changed files with 71 additions and 59 deletions
|
@ -9,6 +9,7 @@ local MAX_MOB_NAME_LENGTH = 30
|
|||
local HORNY_TIME = 30
|
||||
local HORNY_AGAIN_TIME = 300
|
||||
local CHILD_GROW_TIME = 60*20
|
||||
local DEATH_DELAY = 0.5
|
||||
|
||||
local MOB_CAP = {}
|
||||
MOB_CAP.hostile = 70
|
||||
|
@ -334,7 +335,7 @@ local remove_texture_mod = function(self, mod)
|
|||
end
|
||||
|
||||
-- set defined animation
|
||||
local set_animation = function(self, anim)
|
||||
local set_animation = function(self, anim, fixed_frame)
|
||||
|
||||
if not self.animation
|
||||
or not anim then return end
|
||||
|
@ -349,9 +350,17 @@ local set_animation = function(self, anim)
|
|||
|
||||
self.animation.current = anim
|
||||
|
||||
local a_start = self.animation[anim .. "_start"]
|
||||
local a_end
|
||||
if fixed_frame then
|
||||
a_end = a_start
|
||||
else
|
||||
a_end = self.animation[anim .. "_end"]
|
||||
end
|
||||
|
||||
self.object:set_animation({
|
||||
x = self.animation[anim .. "_start"],
|
||||
y = self.animation[anim .. "_end"]},
|
||||
x = a_start,
|
||||
y = a_end},
|
||||
self.animation[anim .. "_speed"] or self.animation.speed_normal or 15,
|
||||
0, self.animation[anim .. "_loop"] ~= false)
|
||||
end
|
||||
|
@ -669,6 +678,10 @@ end
|
|||
-- check if mob is dead or only hurt
|
||||
local check_for_death = function(self, cause, cmi_cause)
|
||||
|
||||
if self.state == "die" then
|
||||
return true
|
||||
end
|
||||
|
||||
-- has health actually changed?
|
||||
if self.health == self.old_health and self.health > 0 then
|
||||
return false
|
||||
|
@ -713,33 +726,39 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
return false
|
||||
end
|
||||
|
||||
-- dropped cooked item if mob died in fire or lava
|
||||
if cause == "lava" or cause == "fire" then
|
||||
item_drop(self, true)
|
||||
else
|
||||
item_drop(self, nil)
|
||||
end
|
||||
|
||||
mob_sound(self, "death")
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
local function death_handle(self)
|
||||
-- dropped cooked item if mob died in fire or lava
|
||||
if cause == "lava" or cause == "fire" then
|
||||
item_drop(self, true)
|
||||
else
|
||||
item_drop(self, nil)
|
||||
end
|
||||
|
||||
if mod_experience and self.hp_min and self.hp_max then
|
||||
mcl_experience.throw_experience(pos, math.ceil( math.random(self.hp_min,self.hp_max+5) / 5) )
|
||||
local pos = self.object:get_pos()
|
||||
|
||||
if mod_experience and self.hp_min and self.hp_max then
|
||||
mcl_experience.throw_experience(pos, math.ceil( math.random(self.hp_min,self.hp_max+5) / 5) )
|
||||
end
|
||||
end
|
||||
|
||||
-- execute custom death function
|
||||
if self.on_die then
|
||||
|
||||
self.on_die(self, pos)
|
||||
death_handle(self)
|
||||
|
||||
local pos = self.object:get_pos()
|
||||
local on_die_exit = self.on_die(self, pos)
|
||||
|
||||
if use_cmi then
|
||||
cmi.notify_die(self.object, cmi_cause)
|
||||
end
|
||||
|
||||
self.object:remove()
|
||||
|
||||
return true
|
||||
if on_die_exit == true then
|
||||
self.object:remove()
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local collisionbox
|
||||
|
@ -747,6 +766,7 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
collisionbox = table.copy(self.collisionbox)
|
||||
end
|
||||
|
||||
local length = 0
|
||||
-- default death function and die animation (if defined)
|
||||
if self.animation
|
||||
and self.animation.die_start
|
||||
|
@ -754,40 +774,41 @@ local check_for_death = function(self, cause, cmi_cause)
|
|||
|
||||
local frames = self.animation.die_end - self.animation.die_start
|
||||
local speed = self.animation.die_speed or 15
|
||||
local length = max(frames / speed, 0)
|
||||
|
||||
self.attack = nil
|
||||
self.v_start = false
|
||||
self.timer = 0
|
||||
self.blinktimer = 0
|
||||
self.passive = true
|
||||
self.state = "die"
|
||||
self.object:set_properties({
|
||||
pointable = false,
|
||||
})
|
||||
set_velocity(self, 0)
|
||||
length = max(frames / speed, 0) + DEATH_DELAY
|
||||
set_animation(self, "die")
|
||||
|
||||
minetest.after(length, function(self)
|
||||
if not self.object:get_luaentity() then
|
||||
return
|
||||
end
|
||||
if use_cmi then
|
||||
cmi.notify_die(self.object, cmi_cause)
|
||||
end
|
||||
|
||||
self.object:remove()
|
||||
mobs.death_effect(pos)
|
||||
end, self)
|
||||
else
|
||||
local rot = self.object:get_rotation()
|
||||
rot.z = math.pi/2
|
||||
self.object:set_rotation(rot)
|
||||
length = 1 + DEATH_DELAY
|
||||
set_animation(self, "stand", true)
|
||||
end
|
||||
|
||||
if use_cmi then
|
||||
self.attack = nil
|
||||
self.v_start = false
|
||||
self.timer = 0
|
||||
self.blinktimer = 0
|
||||
self.passive = true
|
||||
self.state = "die"
|
||||
self.object:set_properties({
|
||||
pointable = false,
|
||||
})
|
||||
set_velocity(self, 0)
|
||||
|
||||
minetest.after(length, function(self)
|
||||
if not self.object:get_luaentity() then
|
||||
return
|
||||
end
|
||||
if use_cmi then
|
||||
cmi.notify_die(self.object, cmi_cause)
|
||||
end
|
||||
|
||||
death_handle(self)
|
||||
local dpos = self.object:get_pos()
|
||||
self.object:remove()
|
||||
mobs.death_effect(pos, collisionbox)
|
||||
end
|
||||
mobs.death_effect(dpos)
|
||||
end, self)
|
||||
|
||||
|
||||
return true
|
||||
end
|
||||
|
@ -2690,7 +2711,7 @@ end
|
|||
-- returns true if mob died
|
||||
local falling = function(self, pos)
|
||||
|
||||
if self.fly then
|
||||
if self.fly and self.state ~= "die" then
|
||||
return
|
||||
end
|
||||
|
||||
|
|
|
@ -284,10 +284,9 @@ Custom Definition Functions
|
|||
Along with the above mob registry settings we can also use custom functions to
|
||||
enhance mob functionality and have them do many interesting things:
|
||||
|
||||
'on_die' a function that is called when the mob is killed the
|
||||
parameters are (self, pos). When this function is used,
|
||||
the death particles will be skipped on death. You can get
|
||||
them back by calling mobs:death_effect manually
|
||||
'on_die' a function that is called when the mob is killed; the
|
||||
parameters are (self, pos). Return true to skip the builtin
|
||||
death animation and death effects
|
||||
'on_rightclick' its same as in minetest.register_entity()
|
||||
'on_blast' is called when an explosion happens near mob when using TNT
|
||||
functions, parameters are (object, damage) and returns
|
||||
|
|
|
@ -33,12 +33,10 @@ mobs:register_mob("mobs_mc:bat", {
|
|||
run_speed = 80,
|
||||
run_start = 0,
|
||||
run_end = 40,
|
||||
-- TODO: Less ugly death animation
|
||||
--[[ die_speed = 60,
|
||||
die_speed = 60,
|
||||
die_start = 40,
|
||||
die_end = 80,
|
||||
die_loop = false,
|
||||
]]
|
||||
},
|
||||
walk_chance = 100,
|
||||
fall_damage = 0,
|
||||
|
|
|
@ -81,7 +81,6 @@ mobs:register_mob("mobs_mc:creeper", {
|
|||
local r = math.random(1, #mobs_mc.items.music_discs)
|
||||
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[r])
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
maxdrops = 2,
|
||||
drops = {
|
||||
|
|
|
@ -507,7 +507,6 @@ mobs:register_mob("mobs_mc:enderman", {
|
|||
if self._taken_node ~= nil and self._taken_node ~= "" then
|
||||
minetest.add_item(pos, self._taken_node)
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
do_punch = function(self, hitter, tflp, tool_caps, dir)
|
||||
-- damage from rain caused by itself so we don't want it to attack itself.
|
||||
|
|
|
@ -175,8 +175,6 @@ local horse = {
|
|||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
|
||||
end,
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
|
|
|
@ -111,7 +111,6 @@ mobs:register_mob("mobs_mc:llama", {
|
|||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
|
||||
end,
|
||||
|
||||
|
|
|
@ -79,7 +79,6 @@ mobs:register_mob("mobs_mc:pig", {
|
|||
if self.driver then
|
||||
mobs.detach(self.driver, {x = 1, y = 0, z = 1})
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
|
||||
on_rightclick = function(self, clicker)
|
||||
|
|
|
@ -51,6 +51,7 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance
|
|||
end
|
||||
end, children, self.attack)
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1053,7 +1053,6 @@ mobs:register_mob("mobs_mc:villager", {
|
|||
return_fields(player)
|
||||
end
|
||||
end
|
||||
mobs.death_effect(pos, self.collisionbox)
|
||||
end,
|
||||
})
|
||||
|
||||
|
|
Reference in a new issue