From e75731dcff76446aeb3b4dbc7ee3f41a6410875a Mon Sep 17 00:00:00 2001 From: Jordan Irwin Date: Mon, 19 Jul 2021 23:04:55 -0700 Subject: [PATCH] Fix chasing player when close --- TODO.txt | 1 - entity.lua | 104 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 97 insertions(+), 8 deletions(-) diff --git a/TODO.txt b/TODO.txt index 754475c..1df2898 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,7 +2,6 @@ TODO: - add version using mobs_redo API - add version using cmer API -- fix chasing player - fix explosion leaving "tnt:boom" node - add wear to armor when exploding - add no-griefing setting diff --git a/entity.lua b/entity.lua index c80995d..f0ded07 100644 --- a/entity.lua +++ b/entity.lua @@ -112,7 +112,7 @@ local def = { modes = { idle = {chance=0.3}, walk = {chance=0.7, moving_speed=1.5}, - follow = {radius=10}, + --chase = {moving_speed=1.5}, --death = {}, }, model = { @@ -123,7 +123,7 @@ local def = { animations = { idle = {start=0, stop=79, speed=30}, walk = {start=168, stop=187, speed=30}, - follow = {start=168, stop=187, speed=30}, + --chase = {start=168, stop=187, speed=30}, --death = {}, }, }, @@ -187,14 +187,12 @@ def.on_activate = function(self, staticdata, dtime_s) end ---[[ local function isnan(n) return tostring(n) == tostring((-1)^.5) end -]] local function expand(self) - if self.chase and self.visualx < 2 then + if self.expanding and self.visualx < 2 then if self.hiss == false then core.sound_play("sneeker_hiss", {object=self.object, gain=1.5, max_hear_distance=2*64}) end @@ -218,6 +216,46 @@ local function explode(self, pos) core.sound_play("sneeker_explode", {object=self.object, gain=sneeker.boom_gain, max_hear_distance=2*64}) end +local function chase(self, target) + -- FIXME: why does setting mode = "chase" not work? + if not self.chase_anim then + self.object:set_animation({x=168, y=187}, 30, 0) + self.chase_anim = true + end + + local pos = self.object:get_pos() + local tpos = target:get_pos() + + local vec = {x=tpos.x-pos.x, y=tpos.y-pos.y, z=tpos.z-pos.z} + local yaw = math.atan(vec.z/vec.x)+math.pi^2 + if tpos.x > pos.x then + yaw = yaw+math.pi + end + yaw = yaw-2 + self.object:set_yaw(yaw) + local direction = {x=math.sin(yaw)*-1, y=0, z=math.cos(yaw)} + + -- FIXME: hack + local can_set = true + for _, c in ipairs({direction.x*2.5, direction.z*2.5}) do + if isnan(c) then + can_set = false + break + end + end + + if can_set then + self.object:set_velocity({x=direction.x*2.5, y=self.object:get_velocity().y, z=direction.z*2.5}) + end +end + +local function end_chase(self) + self.chasing = nil + self.chase_anim = false + self.mode = "idle" + self.expanding = false +end + def.on_step = function(self, staticdata, dtime_s) --[[ -- update lifetime timer @@ -297,6 +335,17 @@ def.on_step = function(self, staticdata, dtime_s) expand(self) + local players_within_10 = {} + for _, object in ipairs(core.get_objects_inside_radius(pos, 10)) do + if object:is_player() then + table.insert(players_within_10, object) + end + end + + if not self.chasing then + self.chasing = players_within_10[1] + end + --[[ self.chase = false @@ -358,7 +407,46 @@ def.on_step = function(self, staticdata, dtime_s) end ]] - if self.state == "chase" then + if self.chasing then + if self.chasing:get_hp() > 0 then + self.mode = "chase" + + local within_2 = false + for _, object in ipairs(core.get_objects_inside_radius(pos, 2)) do + if object == self.chasing then + within_2 = true + break + end + end + + if within_2 then + if self.visualx >= 2 then + explode(self, pos) + self.chasing = nil + return true + end + self.expanding = true + else + self.expanding = false + end + + local within_10 = false + for _, object in ipairs(players_within_10) do + if object == self.chasing then + within_10 = true + break + end + end + + if within_10 then + -- follow player + chase(self, self.chasing) + return true + end + end + + end_chase(self) + --[[ if self.anim ~= ANIM_WALK then self.object:set_animation({x=animation.walk_START, y=animation.walk_END}, anim_speed, 0) @@ -366,7 +454,6 @@ def.on_step = function(self, staticdata, dtime_s) end self.turn = "straight" - ]] local inside_2 = core.get_objects_inside_radius(pos, 2) @@ -382,6 +469,7 @@ def.on_step = function(self, staticdata, dtime_s) end end end + ]] --[[ if #inside ~= 0 then @@ -436,6 +524,8 @@ def.on_step = function(self, staticdata, dtime_s) self.state = "stand" end ]] + elseif self.mode == "chase" then + self.mode = "idle" end --[[