From 738be4d0030dfdf3591b61458c5e3a99de7ae763 Mon Sep 17 00:00:00 2001 From: ElCeejo Date: Thu, 21 Jul 2022 13:25:11 -0700 Subject: [PATCH] Fix spinning mobs --- api.lua | 15 ++++++++++----- methods.lua | 12 +++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/api.lua b/api.lua index 3dad10f..8e4195e 100644 --- a/api.lua +++ b/api.lua @@ -19,6 +19,7 @@ local function clamp(val, min, max) end local vec_dist = vector.distance +local vec_multi = vector.multiply local vec_equals = vector.equals local vec_add = vector.add @@ -136,6 +137,7 @@ function creatura.get_node_def(node) -- Node can be name or pos end function creatura.get_ground_level(pos2, max_diff) + pos2.y = math.floor(pos2.y - 0.49) local node = minetest.get_node(pos2) local node_under = minetest.get_node({ x = pos2.x, @@ -207,12 +209,15 @@ local moveable = creatura.is_pos_moveable function creatura.fast_ray_sight(pos1, pos2, water) local ray = minetest.raycast(pos1, pos2, false, water or false) - for pointed_thing in ray do - if pointed_thing.type == "node" then - return false, vec_dist(pos1, pointed_thing.intersection_point), pointed_thing.ref + local pointed_thing = ray:next() + while pointed_thing do + if pointed_thing.type == "node" + and creatura.get_node_def(pointed_thing.under).walkable then + return false, vec_dist(pos1, pointed_thing.intersection_point), pointed_thing.ref, pointed_thing.intersection_point end + pointed_thing = ray:next() end - return true, vec_dist(pos1, pos2) + return true, vec_dist(pos1, pos2), false, pos2 end local fast_ray_sight = creatura.fast_ray_sight @@ -432,7 +437,7 @@ function creatura.drop_items(self) end end -function creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction) +function creatura.basic_punch_func(self, puncher, time_from_last_punch, tool_capabilities, direction, damage) if not puncher then return end local tool = "" if puncher:is_player() then diff --git a/methods.lua b/methods.lua index 2214e0e..fd745a0 100644 --- a/methods.lua +++ b/methods.lua @@ -30,6 +30,11 @@ local vec_add = vector.add local yaw2dir = minetest.yaw_to_dir local dir2yaw = minetest.dir_to_yaw +local function vec_raise(v, n) + if not v then return end + return {x = v.x, y = v.y + n, z = v.z} +end + --[[local function debugpart(pos, time, tex) minetest.add_particle({ pos = pos, @@ -198,7 +203,7 @@ creatura.register_movement_method("creatura:pathfind", function(self) local function func(_self, goal, speed_factor) local pos = _self.object:get_pos() if not pos then return end - pos.y = creatura.get_ground_level(pos, 3).y + pos.y = pos.y + 0.5 -- Return true when goal is reached if vec_dist(pos, goal) < box * 1.33 then _self:halt() @@ -245,7 +250,7 @@ creatura.register_movement_method("creatura:theta_pathfind", function(self) local function func(_self, goal, speed_factor) local pos = _self.object:get_pos() if not pos then return end - pos.y = creatura.get_ground_level(pos, 3).y + pos.y = pos.y + 0.5 -- Return true when goal is reached if vec_dist(pos, goal) < box * 1.33 then _self:halt() @@ -293,13 +298,14 @@ creatura.register_movement_method("creatura:obstacle_avoidance", function(self) local function func(_self, goal, speed_factor) local pos = _self.object:get_pos() if not pos then return end + goal.y = creatura.get_ground_level(goal, 2).y pos.y = creatura.get_ground_level(pos, 2).y -- Return true when goal is reached if vec_dist(pos, goal) < box * 1.33 then _self:halt() return true end - local steer_to = get_avoidance_dir(_self, goal) + --local steer_to = get_avoidance_dir(_self, goal) -- Get movement direction local goal_dir = vec_dir(pos, goal) if steer_to then