mirror of
https://github.com/ElCeejo/creatura.git
synced 2025-03-21 15:21:24 +00:00
Smarter despawning
This commit is contained in:
parent
fca02054e8
commit
9c4c4932df
1 changed files with 17 additions and 50 deletions
67
mob_meta.lua
67
mob_meta.lua
|
@ -506,7 +506,7 @@ function mob:set_scale(x)
|
||||||
},
|
},
|
||||||
collisionbox = new_box
|
collisionbox = new_box
|
||||||
})
|
})
|
||||||
self._border = index_box_border(self)
|
--self._border = index_box_border(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Fixes mob scale being changed when attached to a parent
|
-- Fixes mob scale being changed when attached to a parent
|
||||||
|
@ -748,7 +748,6 @@ function mob:activate(staticdata, dtime)
|
||||||
self.height = self:get_height() or 1
|
self.height = self:get_height() or 1
|
||||||
self._tyaw = self.object:get_yaw()
|
self._tyaw = self.object:get_yaw()
|
||||||
self.last_yaw = self.object:get_yaw()
|
self.last_yaw = self.object:get_yaw()
|
||||||
self.active_time = 0
|
|
||||||
self.in_liquid = false
|
self.in_liquid = false
|
||||||
self.is_falling = false
|
self.is_falling = false
|
||||||
self.touching_ground = false
|
self.touching_ground = false
|
||||||
|
@ -800,10 +799,12 @@ function mob:activate(staticdata, dtime)
|
||||||
if #self.textures > 0 then self.texture_no = random(#self.textures) end
|
if #self.textures > 0 then self.texture_no = random(#self.textures) end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self.active_time = self:recall("active_time") or 0
|
||||||
|
|
||||||
if self:recall("despawn_after") ~= nil then
|
if self:recall("despawn_after") ~= nil then
|
||||||
self.despawn_after = self:recall("despawn_after")
|
self.despawn_after = self:recall("despawn_after")
|
||||||
end
|
end
|
||||||
self._despawn = self:recall("_despawn") or false
|
self._despawn = self:recall("_despawn") or nil
|
||||||
|
|
||||||
if self._despawn
|
if self._despawn
|
||||||
and self.despawn_after
|
and self.despawn_after
|
||||||
|
@ -813,7 +814,7 @@ function mob:activate(staticdata, dtime)
|
||||||
end
|
end
|
||||||
|
|
||||||
self._breath = self:recall("_breath") or (self.max_breath or 30)
|
self._breath = self:recall("_breath") or (self.max_breath or 30)
|
||||||
self._border = index_box_border(self)
|
--self._border = index_box_border(self)
|
||||||
|
|
||||||
if self.textures
|
if self.textures
|
||||||
and self.texture_no then
|
and self.texture_no then
|
||||||
|
@ -903,9 +904,18 @@ function mob:on_step(dtime, moveresult)
|
||||||
end
|
end
|
||||||
self.properties = nil
|
self.properties = nil
|
||||||
self.active_time = self.active_time + dtime
|
self.active_time = self.active_time + dtime
|
||||||
if self.despawn_after
|
self:memorize("active_time", self.active_time)
|
||||||
and self.active_time >= self.despawn_after then
|
if self.despawn_after then
|
||||||
self._despawn = self:memorize("_despawn", true)
|
local despawn = math.floor(self.active_time / self.despawn_after)
|
||||||
|
if despawn > 0 then
|
||||||
|
if despawn > 1 then
|
||||||
|
self.object:remove()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not self._despawn then
|
||||||
|
self._despawn = self:memorize("_despawn", true)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -921,51 +931,10 @@ end
|
||||||
-- Object API --
|
-- Object API --
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
local fancy_step = false
|
|
||||||
|
|
||||||
local step_type = minetest.settings:get("creatura_step_type")
|
|
||||||
|
|
||||||
if step_type == "fancy" then
|
|
||||||
fancy_step = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Physics
|
-- Physics
|
||||||
|
|
||||||
local moveable = creatura.is_pos_moveable
|
local moveable = creatura.is_pos_moveable
|
||||||
|
|
||||||
local function do_step(self)
|
|
||||||
if not fancy_step then return end
|
|
||||||
local pos = self.object:get_pos()
|
|
||||||
local vel = self.object:get_velocity()
|
|
||||||
if not self._step then
|
|
||||||
if self.touching_ground
|
|
||||||
and abs(vel.x + vel.z) > 0 then
|
|
||||||
local border = self._border
|
|
||||||
local yaw_offset = vec_add(pos, vec_multi(minetest.yaw_to_dir(self.object:get_yaw()), self.width + 0.7))
|
|
||||||
table.sort(border, function(a, b)
|
|
||||||
return vec_dist(vec_add(pos, a), yaw_offset) < vec_dist(vec_add(pos, b), yaw_offset)
|
|
||||||
end)
|
|
||||||
local step_pos = vec_center(vec_add(pos, border[1]))
|
|
||||||
local halfway = vec_add(pos, vec_multi(vec_dir(pos, step_pos), 0.5))
|
|
||||||
halfway.y = step_pos.y
|
|
||||||
if creatura.get_node_def(step_pos).walkable
|
|
||||||
and abs(diff(self.object:get_yaw(), minetest.dir_to_yaw(vec_dir(pos, step_pos)))) < 1.5
|
|
||||||
and moveable(halfway, self.width, self.height) then
|
|
||||||
self._step = vec_center(step_pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
self.object:set_velocity(vector.new(vel.x, 7, vel.z))
|
|
||||||
if self._step.y < pos.y - 0.5 then
|
|
||||||
self.object:set_velocity(vector.new(vel.x, 0.5, vel.z))
|
|
||||||
self._step = nil
|
|
||||||
local step_pos = self.object:get_pos()
|
|
||||||
local dir = minetest.yaw_to_dir(self.object:get_yaw())
|
|
||||||
step_pos = vec_add(step_pos, vec_multi(dir, 0.1))
|
|
||||||
self.object:set_pos(step_pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function collision_detection(self)
|
local function collision_detection(self)
|
||||||
if not creatura.is_alive(self)
|
if not creatura.is_alive(self)
|
||||||
|
@ -1053,8 +1022,6 @@ function mob:_physics(moveresult)
|
||||||
local node = self.stand_node
|
local node = self.stand_node
|
||||||
if not pos or not node then return end
|
if not pos or not node then return end
|
||||||
water_physics(self, pos, node)
|
water_physics(self, pos, node)
|
||||||
-- Step up nodes
|
|
||||||
do_step(self, moveresult)
|
|
||||||
-- Object collision
|
-- Object collision
|
||||||
collision_detection(self)
|
collision_detection(self)
|
||||||
local in_liquid = self.in_liquid
|
local in_liquid = self.in_liquid
|
||||||
|
|
Loading…
Add table
Reference in a new issue