Make mobs flop when outside of flying node
parent
84ca7681fc
commit
f1141aed9f
|
@ -193,41 +193,54 @@ local fly_state_switch = function(self, dtime)
|
||||||
self.state_timer = math.random(4,10) + math.random()
|
self.state_timer = math.random(4,10) + math.random()
|
||||||
self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)]
|
self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)]
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--this is going to need some more logic gates because birds can flop around
|
||||||
|
local flop = function(self,dtime)
|
||||||
|
mobs.flop(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- states are executed here
|
||||||
local fly_state_execution = function(self,dtime)
|
local fly_state_execution = function(self,dtime)
|
||||||
|
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
local current_node = minetest_get_node(pos).name
|
local current_node = minetest_get_node(pos).name
|
||||||
local inside_swim_node = false
|
local inside_fly_node = false
|
||||||
|
|
||||||
|
--quick scan everything to see if inside fly node
|
||||||
for _,id in pairs(self.fly_in) do
|
for _,id in pairs(self.fly_in) do
|
||||||
if id == current_node then
|
if id == current_node then
|
||||||
inside_swim_node = true
|
inside_fly_node = true
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
print(inside_swim_node)
|
|
||||||
|
|
||||||
if self.state == "stand" then
|
|
||||||
|
|
||||||
--do animation
|
|
||||||
--mobs.set_mob_animation(self, "stand")
|
|
||||||
|
|
||||||
--set the velocity of the mob
|
|
||||||
--mobs.set_velocity(self,0)
|
|
||||||
|
|
||||||
--print("standing")
|
|
||||||
|
|
||||||
elseif self.state == "fly" then
|
|
||||||
|
|
||||||
|
|
||||||
--print("flying")
|
--fly properly if inside fly node
|
||||||
|
if inside_fly_node then
|
||||||
|
if self.state == "stand" then
|
||||||
|
|
||||||
|
--do animation
|
||||||
|
--mobs.set_mob_animation(self, "stand")
|
||||||
|
|
||||||
|
--set the velocity of the mob
|
||||||
|
--mobs.set_velocity(self,0)
|
||||||
|
|
||||||
|
--print("standing")
|
||||||
|
|
||||||
|
elseif self.state == "fly" then
|
||||||
|
|
||||||
|
|
||||||
|
--print("flying")
|
||||||
|
|
||||||
|
end
|
||||||
|
--flop around if not inside fly node
|
||||||
|
else
|
||||||
|
--print("flopping")
|
||||||
|
flop(self,dtime)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
local math_pi = math.pi
|
local math_pi = math.pi
|
||||||
local math_sin = math.sin
|
local math_sin = math.sin
|
||||||
local math_cos = math.cos
|
local math_cos = math.cos
|
||||||
|
local math_random = math.random
|
||||||
|
local DOUBLE_PI = math_pi * 2
|
||||||
|
|
||||||
-- localize vector functions
|
-- localize vector functions
|
||||||
local vector_new = vector.new
|
local vector_new = vector.new
|
||||||
local vector_length = vector.length
|
local vector_length = vector.length
|
||||||
|
local vector_multiply = vector.multiply
|
||||||
|
|
||||||
|
local minetest_yaw_to_dir = minetest.yaw_to_dir
|
||||||
|
|
||||||
-- move mob in facing direction
|
-- move mob in facing direction
|
||||||
--this has been modified to be internal
|
--this has been modified to be internal
|
||||||
|
@ -60,7 +65,37 @@ mobs.jump = function(self, velocity)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--fallback velocity to allow modularity
|
||||||
velocity = velocity or 8
|
velocity = velocity or 8
|
||||||
|
|
||||||
self.object:add_velocity(vector_new(0,velocity,0))
|
self.object:add_velocity(vector_new(0,velocity,0))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--make mobs flop
|
||||||
|
mobs.flop = function(self, velocity)
|
||||||
|
|
||||||
|
if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
mobs.set_velocity(self, 0)
|
||||||
|
|
||||||
|
--fallback velocity to allow modularity
|
||||||
|
velocity = velocity or 8
|
||||||
|
|
||||||
|
--create a random direction (2d yaw)
|
||||||
|
local dir = DOUBLE_PI * math_random()
|
||||||
|
|
||||||
|
--create a random force value
|
||||||
|
local force = math_random(0,3) + math_random()
|
||||||
|
|
||||||
|
--convert the yaw to a direction vector then multiply it times the force
|
||||||
|
local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force)
|
||||||
|
|
||||||
|
--place in the "flop" velocity to make the mob flop
|
||||||
|
final_additional_force.y = velocity
|
||||||
|
|
||||||
|
self.object:add_velocity(final_additional_force)
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
Loading…
Reference in New Issue