diff --git a/api.lua b/api.lua index cc4afed..8b3a90e 100644 --- a/api.lua +++ b/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 diff --git a/boids.lua b/boids.lua index 049ac63..18d4cf9 100644 --- a/boids.lua +++ b/boids.lua @@ -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 \ No newline at end of file diff --git a/methods.lua b/methods.lua index 5c27871..041b710 100644 --- a/methods.lua +++ b/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 diff --git a/mob_meta.lua b/mob_meta.lua index a48dbf3..1b3e3db 100644 --- a/mob_meta.lua +++ b/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