forked from Mirrorlandia_minetest/mod-sneeker
Fix chasing player when close
This commit is contained in:
parent
af218cc5ec
commit
e59081ea02
1
TODO.txt
1
TODO.txt
@ -3,6 +3,5 @@ TODO:
|
|||||||
- add version using mobs_redo API
|
- add version using mobs_redo API
|
||||||
- add version using cmer API
|
- add version using cmer API
|
||||||
- add griefing option
|
- add griefing option
|
||||||
- fix chasing player
|
|
||||||
- add wear to armor when exploding
|
- add wear to armor when exploding
|
||||||
- disable attacking if damage disabled
|
- disable attacking if damage disabled
|
||||||
|
104
entity.lua
104
entity.lua
@ -115,7 +115,7 @@ local def = {
|
|||||||
modes = {
|
modes = {
|
||||||
idle = {chance=0.3},
|
idle = {chance=0.3},
|
||||||
walk = {chance=0.7, moving_speed=1.5},
|
walk = {chance=0.7, moving_speed=1.5},
|
||||||
follow = {radius=10},
|
--chase = {moving_speed=1.5},
|
||||||
--death = {},
|
--death = {},
|
||||||
},
|
},
|
||||||
model = {
|
model = {
|
||||||
@ -126,7 +126,7 @@ local def = {
|
|||||||
animations = {
|
animations = {
|
||||||
idle = {start=0, stop=79, speed=30},
|
idle = {start=0, stop=79, speed=30},
|
||||||
walk = {start=168, stop=187, speed=30},
|
walk = {start=168, stop=187, speed=30},
|
||||||
follow = {start=168, stop=187, speed=30},
|
--chase = {start=168, stop=187, speed=30},
|
||||||
--death = {},
|
--death = {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -190,14 +190,12 @@ def.on_activate = function(self, staticdata, dtime_s)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--[[
|
|
||||||
local function isnan(n)
|
local function isnan(n)
|
||||||
return tostring(n) == tostring((-1)^.5)
|
return tostring(n) == tostring((-1)^.5)
|
||||||
end
|
end
|
||||||
]]
|
|
||||||
|
|
||||||
local function expand(self)
|
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
|
if self.hiss == false then
|
||||||
core.sound_play("sneeker_hiss", {object=self.object, gain=1.5, max_hear_distance=2*64})
|
core.sound_play("sneeker_hiss", {object=self.object, gain=1.5, max_hear_distance=2*64})
|
||||||
end
|
end
|
||||||
@ -252,6 +250,46 @@ local function h_collides(pos, collision_info, touching_ground)
|
|||||||
end
|
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, dtime, moveresult)
|
def.on_step = function(self, dtime, moveresult)
|
||||||
--[[
|
--[[
|
||||||
-- update lifetime timer
|
-- update lifetime timer
|
||||||
@ -338,6 +376,17 @@ def.on_step = function(self, dtime, moveresult)
|
|||||||
|
|
||||||
expand(self)
|
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
|
self.chase = false
|
||||||
|
|
||||||
@ -394,7 +443,46 @@ def.on_step = function(self, dtime, moveresult)
|
|||||||
end
|
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
|
if self.anim ~= ANIM_WALK then
|
||||||
self.object:set_animation({x=animation.walk_START, y=animation.walk_END}, anim_speed, 0)
|
self.object:set_animation({x=animation.walk_START, y=animation.walk_END}, anim_speed, 0)
|
||||||
@ -402,7 +490,6 @@ def.on_step = function(self, dtime, moveresult)
|
|||||||
end
|
end
|
||||||
|
|
||||||
self.turn = "straight"
|
self.turn = "straight"
|
||||||
]]
|
|
||||||
|
|
||||||
local inside_2 = core.get_objects_inside_radius(pos, 2)
|
local inside_2 = core.get_objects_inside_radius(pos, 2)
|
||||||
|
|
||||||
@ -418,6 +505,7 @@ def.on_step = function(self, dtime, moveresult)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
if #inside ~= 0 then
|
if #inside ~= 0 then
|
||||||
@ -467,6 +555,8 @@ def.on_step = function(self, dtime, moveresult)
|
|||||||
self.state = "stand"
|
self.state = "stand"
|
||||||
end
|
end
|
||||||
]]
|
]]
|
||||||
|
elseif self.mode == "chase" then
|
||||||
|
self.mode = "idle"
|
||||||
end
|
end
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
|
Loading…
Reference in New Issue
Block a user