1 --this is where all the movement code is stored for the pig mob
3 --This makes the mob walk at a certain speed and jump
4 pig.move = function(self,dtime)
5 self.manage_jump_timer(self,dtime)
6 self.timer = self.timer - dtime
15 --direction state change
16 if self.timer <= 0 and not self.following == true then
17 --print("changing direction")
18 self.timer = math.random(2,7)
19 self.direction = vector.new(math.random()*math.random(-1,1),0,math.random()*math.random(-1,1))
20 --local yaw = self.object:get_yaw() + dtime
21 self.speed = math.random(0,6)
22 --self.object:set_yaw(yaw)
25 local currentvel = self.object:getvelocity()
26 local goal = vector.multiply(self.direction,self.speed)
27 local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
28 acceleration = vector.multiply(acceleration, 0.05)
29 self.object:add_velocity(acceleration)
32 --use raycasting to jump
33 pig.jump = function(self)
34 if self.jump_timer <= 0 then
35 local vel = self.object:get_velocity()
36 if (self.direction.x ~= 0 and vel.x == 0) or (self.direction.z ~= 0 and vel.z == 0) then
37 local pos = self.object:get_pos()
38 local ground_distance = self.object:get_properties().collisionbox[2]
39 local ray = minetest.raycast(pos, vector.add(pos, vector.new(0,ground_distance*1.1,0)), false, false)
41 for pointed_thing in ray do
42 local collision_point = pointed_thing.under
43 if collision_point then
44 local walkable = minetest.registered_nodes[minetest.get_node(collision_point).name].walkable
46 local distance = vector.subtract(collision_point,pos).y-self.object:get_properties().collisionbox[2]+0.4
47 if distance >= -0.11 then
48 local vel = self.object:get_velocity()
50 self.object:add_velocity(vector.new(vel.x,5,vel.z))
61 pig.swim = function(self,dtime)
62 local pos = self.object:getpos()
64 local node = minetest.get_node(pos).name
66 if node == "main:water" or node =="main:waterflow" then
67 local vel = self.object:getvelocity()
69 local acceleration = vector.new(0,goal-vel.y,0)
70 --jump out of the water
71 if (vel.x == 0 and self.direction.x ~= 0) or (vel.z == 0 and self.direction.z ~= 0) then
72 self.object:set_velocity(vector.new(vel.x,5,vel.z))
75 self.object:add_velocity(acceleration)