Stability Improvements

This commit is contained in:
ElCeejo 2022-08-06 16:19:48 -07:00
parent e59d517a23
commit 6457f301b8

View file

@ -152,6 +152,7 @@ function mob:halt()
gravity = self._movement_data.gravity or -9.8, gravity = self._movement_data.gravity or -9.8,
speed = 0 speed = 0
} }
--self.object:set_velocity({x = 0, y = 0, z = 0})
self._path_data = {} self._path_data = {}
end end
@ -163,17 +164,31 @@ local function interp_rad(a, b, w)
return atan2(sn, cs) return atan2(sn, cs)
end end
local function turn(self, tyaw, rate)
local rate = rate or 5
local rot = self.object:get_rotation()
local yaw = self.object:get_yaw()
if not yaw then return end
local step = math.min(self.dtime * rate, abs(diff(yaw, tyaw)) % (pi2))
rot.y = interp_rad(yaw, tyaw, step)
self.object:set_rotation(rot)
end
function mob:turn_to(tyaw, rate) function mob:turn_to(tyaw, rate)
if self.step_delay then
self._tyaw = tyaw self._tyaw = tyaw
self._movement_data.turn_rate = rate or 5 self._movement_data.turn_rate = rate or 5
return
end
turn(self, tyaw, rate)
end end
function mob:do_turn() function mob:do_turn()
if not self.step_delay then return end
local tyaw = self._tyaw local tyaw = self._tyaw
local rate = self._movement_data.turn_rate or 5 local rate = self._movement_data.turn_rate or 5
local yaw = self.object:get_yaw() if not tyaw then return end
local step = math.min(self.dtime * rate, abs(diff(yaw, tyaw)) % (pi2)) turn(self, self._tyaw, rate)
self.object:set_yaw(interp_rad(yaw, tyaw, step))
end end
-- Set Gravity (default of -9.8) -- Set Gravity (default of -9.8)
@ -184,19 +199,27 @@ end
-- Sets Velocity to desired speed in mobs current look direction -- Sets Velocity to desired speed in mobs current look direction
function mob:set_forward_velocity(_speed) function mob:set_forward_velocity(speed)
local speed = _speed or self._movement_data.speed self._movement_data.horz_vel = speed
local dir = minetest.yaw_to_dir(self.object:get_yaw())
local vel = vec_multi(dir, speed)
vel.y = self.object:get_velocity().y
self.object:set_velocity(vel)
end end
-- Sets Velocity on y axis -- Sets Velocity on y axis
function mob:set_vertical_velocity(speed) function mob:set_vertical_velocity(speed)
local vel = self.object:get_velocity() or {x = 0, y = 0, z = 0} self._movement_data.vert_vel = speed
vel.y = speed end
function mob:do_velocity()
local data = self._movement_data or {}
local vel = self.object:get_velocity()
local yaw = self.object:get_yaw()
if not yaw then return end
local dir = minetest.yaw_to_dir(yaw)
local horz_vel = data.horz_vel
local vert_vel = data.vert_vel
vel.x = (horz_vel and horz_vel * dir.x) or vel.x
vel.y = vert_vel or vel.y
vel.z = (horz_vel and horz_vel * dir.z) or vel.z
self.object:set_velocity(vel) self.object:set_velocity(vel)
end end
@ -795,14 +818,12 @@ function mob:on_step(dtime, moveresult)
self:_physics(moveresult) self:_physics(moveresult)
end end
end end
self:do_velocity()
self:do_turn()
if self.utility_stack if self.utility_stack
and self._execute_utilities then and self._execute_utilities then
self:_execute_utilities() self:_execute_utilities()
end end
local turn = self._movement_data and self._movement_data.func ~= nil
if turn then
self:do_turn()
end
-- Die -- Die
if self.hp <= 0 if self.hp <= 0
and self.death_func then and self.death_func then
@ -1107,6 +1128,8 @@ function mob:_execute_utilities()
end end
local dtime = self.dtime local dtime = self.dtime
self.dtime = dtime + (self.step_delay or 0) self.dtime = dtime + (self.step_delay or 0)
self:set_forward_velocity(nil)
self:set_vertical_velocity(nil)
if func(self) then if func(self) then
self._utility_data = { self._utility_data = {
utility = nil, utility = nil,