2 mobs.create_movement_functions = function(def,mob_register)
4 mob_register.swim = function(self,dtime)
5 local pos = self.object:getpos()
7 local node = minetest.get_node(pos).name
9 if node == "main:water" or node =="main:waterflow" then
10 local vel = self.object:getvelocity()
12 local acceleration = vector.new(0,goal-vel.y,0)
13 --jump out of the water
14 if (vel.x == 0 and self.direction.x ~= 0) or (vel.z == 0 and self.direction.z ~= 0) then
15 self.object:set_velocity(vector.new(vel.x,5,vel.z))
18 self.object:add_velocity(acceleration)
24 local get_group = minetest.get_node_group
25 local get_node = minetest.get_node
26 mob_register.hurt_inside = function(self,dtime)
27 if self.hp > 0 and self.hurt_inside_timer <= 0 then
28 local pos = self.object:getpos()
29 local hurty = get_group(get_node(pos).name, "hurt_inside")
31 self.object:punch(self.object, 2,
33 full_punch_interval=1.5,
34 damage_groups = {damage=hurty},
38 self.hurt_inside_timer = self.hurt_inside_timer - dtime
42 --This makes the mob walk at a certain speed and jump
43 if def.movement_type == "walk" then
44 mob_register.move = function(self,dtime)
45 self.manage_jump_timer(self,dtime)
46 self.timer = self.timer - dtime
55 --direction state change
56 if self.timer <= 0 and not self.following == true then
57 --print("changing direction")
58 self.timer = math.random(2,7)
59 self.direction = vector.new(math.random()*math.random(-1,1),0,math.random()*math.random(-1,1))
60 --local yaw = self.object:get_yaw() + dtime
61 self.speed = math.random(0,self.max_speed)
62 --self.object:set_yaw(yaw)
65 self.hurt_inside(self,dtime)
67 local currentvel = self.object:getvelocity()
68 local goal = vector.multiply(self.direction,self.speed)
69 local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
70 acceleration = vector.multiply(acceleration, 0.05)
71 self.object:add_velocity(acceleration)
73 --use raycasting to jump
74 mob_register.jump = function(self)
75 if self.jump_timer <= 0 then
76 local vel = self.object:get_velocity()
77 if (self.direction.x ~= 0 and vel.x == 0) or (self.direction.z ~= 0 and vel.z == 0) then
78 local pos = self.object:get_pos()
79 local ground_distance = self.object:get_properties().collisionbox[2]
80 local ray = minetest.raycast(pos, vector.add(pos, vector.new(0,ground_distance*1.1,0)), false, false)
82 for pointed_thing in ray do
83 local collision_point = pointed_thing.under
84 if collision_point then
85 local nodey = minetest.registered_nodes[minetest.get_node(collision_point).name]
87 local walkable = nodey.walkable
89 local distance = vector.subtract(collision_point,pos).y-self.object:get_properties().collisionbox[2]+0.4
90 if distance >= -0.11 then
91 local vel = self.object:get_velocity()
93 self.object:add_velocity(vector.new(vel.x,5,vel.z))
103 elseif def.movement_type == "jump" then
104 mob_register.move = function(self,dtime)
105 self.manage_jump_timer(self,dtime)
106 self.timer = self.timer - dtime
112 self.swim(self,dtime)
115 --direction state change
116 if self.timer <= 0 and not self.following == true then
117 --print("changing direction")
118 self.timer = math.random(2,7)
119 self.direction = vector.new(math.random()*math.random(-1,1),0,math.random()*math.random(-1,1))
120 --local yaw = self.object:get_yaw() + dtime
121 self.speed = math.random(0,self.max_speed)
122 --self.object:set_yaw(yaw)
125 self.hurt_inside(self,dtime)
127 local currentvel = self.object:getvelocity()
128 if currentvel.y ~= 0 then
129 local goal = vector.multiply(self.direction,self.speed)
130 local acceleration = vector.new(goal.x-currentvel.x,0,goal.z-currentvel.z)
131 acceleration = vector.multiply(acceleration, 0.05)
132 self.object:add_velocity(acceleration)
136 mob_register.jump = function(self)
137 local vel = self.object:get_velocity()
138 if self.jump_timer <= 0 then
139 if vel.y == 0 and self.oldvely and self.oldvely <= 0 then --use <= on self.oldvely to make slime make landing sound
140 minetest.sound_play("slime_splat", {object=self.object, gain = 1.0, max_hear_distance = 10,pitch = math.random(80,100)/100})
141 local vel = self.object:get_velocity()
142 self.jump_timer = 1+math.random()
143 if self.hostile == true then
144 self.jump_timer = 0.5
146 local goal = vector.multiply(self.direction,self.speed)
147 self.object:set_velocity(vector.new(goal.x,5,goal.z))
150 if vel.y == 0 and self.oldvely and self.oldvely < 0 then
151 self.object:set_velocity(vector.new(0,0,0))