]> git.lizzy.rs Git - Crafter.git/blob - mods/mob/api/movement.lua
Fix A LOT of things
[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