Step Delay support

This commit is contained in:
ElCeejo 2022-08-05 17:42:37 -07:00
parent 74ecd52095
commit 8ea75ec64c
4 changed files with 43 additions and 27 deletions

18
api.lua
View file

@ -357,8 +357,8 @@ function creatura.sensor_ceil(self, range, water)
return dist, node
end
function creatura.get_nearby_player(self)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), self.tracking_range)
function creatura.get_nearby_player(self, range)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), range or self.tracking_range)
for _, object in ipairs(objects) do
if object:is_player()
and creatura.is_alive(object) then
@ -367,8 +367,8 @@ function creatura.get_nearby_player(self)
end
end
function creatura.get_nearby_players(self)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), self.tracking_range)
function creatura.get_nearby_players(self, range)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), range or self.tracking_range)
local nearby = {}
for _, object in ipairs(objects) do
if object:is_player()
@ -379,12 +379,13 @@ function creatura.get_nearby_players(self)
return nearby
end
function creatura.get_nearby_object(self, name)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), self.tracking_range)
function creatura.get_nearby_object(self, name, range)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), range or self.tracking_range)
for _, object in ipairs(objects) do
if creatura.is_alive(object)
and not object:is_player()
and object ~= self.object
and not object:get_luaentity()._ignore
and object:get_luaentity().name == name then
return object
end
@ -392,13 +393,14 @@ function creatura.get_nearby_object(self, name)
return
end
function creatura.get_nearby_objects(self, name)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), self.tracking_range)
function creatura.get_nearby_objects(self, name, range)
local objects = minetest.get_objects_inside_radius(self:get_center_pos(), range or self.tracking_range)
local nearby = {}
for _, object in ipairs(objects) do
if creatura.is_alive(object)
and not object:is_player()
and object ~= self.object
and not object:get_luaentity()._ignore
and object:get_luaentity().name == name then
table.insert(nearby, object)
end

View file

@ -134,5 +134,5 @@ function creatura.get_boid_angle(self, _boids, range)
table.insert(vert_params, vert_cohesion + (lift - vert_cohesion) * 0.1)
end
self.boid_heading = nil
return average_angle(params), average_angle(vert_params)
return average_angle(params), average(vert_params)
end

View file

@ -227,7 +227,6 @@ creatura.register_movement_method("creatura:pathfind", function(self)
self:set_gravity(-9.8)
local trimmed = false
local init_path = false
local tick = 4
local function func(_self, goal, speed_factor)
local pos = _self.object:get_pos()
if not pos then return end
@ -237,12 +236,7 @@ creatura.register_movement_method("creatura:pathfind", function(self)
return true
end
-- Get movement direction
local steer_to
tick = tick - 1
if tick <= 0 then
steer_to = get_avoidance_dir(self, goal)
tick = 4
end
local steer_to = get_avoidance_dir(self, goal)
local goal_dir = vec_dir(pos, goal)
if steer_to
and not init_path then
@ -335,8 +329,6 @@ end)
creatura.register_movement_method("creatura:obstacle_avoidance", function(self)
local box = clamp(self.width, 0.5, 1.5)
self:set_gravity(-9.8)
local steer_to
local steer_timer = 0.25
local function func(_self, goal, speed_factor)
local pos = _self.object:get_pos()
if not pos then return end
@ -347,12 +339,9 @@ creatura.register_movement_method("creatura:obstacle_avoidance", function(self)
_self:halt()
return true
end
steer_timer = steer_timer - self.dtime
if steer_timer <= 0 then
steer_to = get_avoidance_dir(_self)
end
-- Get movement direction
local goal_dir = vec_dir(pos, goal)
local steer_to = get_avoidance_dir(self, goal)
if steer_to then
goal_dir = steer_to
end

View file

@ -165,7 +165,12 @@ end
function mob:turn_to(tyaw, rate)
self._tyaw = tyaw
rate = rate or 5
self._movement_data.turn_rate = rate or 5
end
function mob:do_turn()
local tyaw = self._tyaw
local rate = self._movement_data.turn_rate or 5
local yaw = self.object:get_yaw()
local step = math.min(self.dtime * rate, abs(diff(yaw, tyaw)) % (pi2))
self.object:set_yaw(interp_rad(yaw, tyaw, step))
@ -774,10 +779,7 @@ function mob:on_step(dtime, moveresult)
self.touching_ground = moveresult.touching_ground
end
if step_tick <= 0 then
-- Physics and Vitals
if self._physics then
self:_physics(moveresult)
end
-- Vitals
if self._vitals then
self:_vitals()
end
@ -786,10 +788,21 @@ function mob:on_step(dtime, moveresult)
self.width = self:get_hitbox()[4] or 0.5
self.height = self:get_height() or 1
end
local step_delay = self.step_delay and (self._step_delay or 0)
if (step_delay or step_tick) <= 0 then
-- Physics
if self._physics then
self:_physics(moveresult)
end
end
if self.utility_stack
and self._execute_utilities then
self:_execute_utilities()
end
local turn = self._movement_data and self._movement_data.func ~= nil
if turn then
self:do_turn()
end
-- Die
if self.hp <= 0
and self.death_func then
@ -1082,7 +1095,18 @@ function mob:_execute_utilities()
self:initiate_utility(self._utility_data.utility, unpack(self._utility_data.args))
end
local func = self._utility_data.func
local step_delay = self.step_delay and (self._step_delay or 0)
if not func then return end
if step_delay then
if step_delay > 0 then
self._step_delay = step_delay - self.dtime
return
else
self._step_delay = self.step_delay
end
end
local dtime = self.dtime
self.dtime = dtime + self.step_delay
if func(self) then
self._utility_data = {
utility = nil,
@ -1098,6 +1122,7 @@ function mob:_execute_utilities()
self:clear_action()
end
end
self.dtime = dtime
end
end