]> git.lizzy.rs Git - Crafter.git/blob - mods/mob/api/movement.lua
e37b647d2976a524528795d29cde91ee4b90ccb5
[Crafter.git] / mods / mob / api / movement.lua
1 --
2 mobs.create_movement_functions = function(def,mob_register)
3     --makes the mob swim
4     mob_register.swim = function(self,dtime)
5         local pos = self.object:getpos()
6         pos.y = pos.y + 0.3
7         local node = minetest.get_node(pos).name
8         self.swimming = false
9         if node == "main:water" or node =="main:waterflow" then
10             local vel = self.object:getvelocity()
11             local goal = 3
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))
16             --else swim
17             else
18                 self.object:add_velocity(acceleration)
19             end
20             self.swimming = true
21         end
22     end
23
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")
30             if hurty > 0 then
31                 self.object:punch(self.object, 2, 
32                     {
33                     full_punch_interval=1.5,
34                     damage_groups = {damage=hurty},
35                 })
36             end
37         else
38             self.hurt_inside_timer = self.hurt_inside_timer - dtime
39         end
40     end
41
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
47             
48             --jump
49             self.jump(self)
50             
51             --swim
52             self.swim(self,dtime)
53             
54             --print(self.timer)
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)
63             end
64
65             self.hurt_inside(self,dtime)
66
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)
72         end
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)       
81                     if ray then
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]
86                                 if nodey then
87                                     local walkable = nodey.walkable
88                                     if walkable then
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()
92                                             self.jump_timer = 0.5
93                                             self.object:add_velocity(vector.new(vel.x,5,vel.z))
94                                         end
95                                     end
96                                 end
97                             end
98                         end
99                     end
100                 end
101             end
102         end
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
107             
108             --jump
109             self.jump(self)
110             
111             --swim
112             self.swim(self,dtime)
113             
114             --print(self.timer)
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)
123             end
124
125             self.hurt_inside(self,dtime)        
126             
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)
133             end
134         end
135         
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
145                     end
146                     local goal = vector.multiply(self.direction,self.speed)
147                     self.object:set_velocity(vector.new(goal.x,5,goal.z))
148                 end
149             end
150             if vel.y == 0 and self.oldvely and self.oldvely < 0 then
151                 self.object:set_velocity(vector.new(0,0,0))
152             end
153             self.oldvely = vel.y
154         end
155     end
156     
157     
158     return(mob_register)
159 end
160