mirror of
https://github.com/ElCeejo/creatura.git
synced 2025-04-30 13:51:41 -04:00
Step Delay support
This commit is contained in:
parent
74ecd52095
commit
8ea75ec64c
4 changed files with 43 additions and 27 deletions
18
api.lua
18
api.lua
|
@ -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
|
||||
|
|
|
@ -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
|
15
methods.lua
15
methods.lua
|
@ -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
|
||||
|
|
35
mob_meta.lua
35
mob_meta.lua
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue