@@ -28,7 +28,7 @@ function mobs:register_mob(name, def)
2828 follow = def .follow or " " ,
2929
3030 punch_timer = 0 ,
31- env_damage_timer = 0 , -- only if state = "attack"
31+ env_damage_timer = 0 ,
3232 state = " stand" ,
3333 v_start = false ,
3434 to_player = nil ,
@@ -45,31 +45,25 @@ function mobs:register_mob(name, def)
4545 self .object :setvelocity ({x = x , y = self .object :getvelocity ().y , z = z })
4646 end ,
4747
48- do_jump = function (self )
49- local vel = self .object :getvelocity ()
50- if self :get_velocity () < 0.5 and vel .y == 0 then
51- vel .y = 6
52- self .object :setvelocity (vel )
53- return true
54- end
55- end ,
56-
5748 get_velocity = function (self )
5849 local v = self .object :getvelocity ()
5950 return (v .x ^ 2 + v .z ^ 2 ) ^ (0.5 )
6051 end ,
6152
62- set_animation = function (self , type )
53+ get_speed = function (self , type )
6354 local vel = 0
6455 if type == " walk" then
6556 vel = self .walk_velocity
6657 elseif type == " run" then
6758 vel = self .run_velocity
6859 end
69- self :set_velocity (vel )
60+ return vel
61+ end ,
62+
63+ set_animation = function (self , type )
64+ self :set_velocity (self :get_speed (type ))
7065
7166 if not self .animation then return end
72-
7367 if self .animation .current == type then
7468 return
7569 end
@@ -112,9 +106,10 @@ function mobs:register_mob(name, def)
112106 end
113107 end
114108
109+ local vel = self .object :getvelocity ()
115110 local node = minetest .get_node (my_pos ).name
116111 local accel = {x = 0 , y = 0 , z = 0 }
117- if self . object : getvelocity () .y > 0.1 then
112+ if vel .y > 0.1 then
118113 local yaw = self .object :getyaw ()
119114 if self .drawtype == " side" then
120115 yaw = yaw + (math.pi / 2 )
@@ -135,35 +130,38 @@ function mobs:register_mob(name, def)
135130 end
136131 self .punch_timer = 0
137132
133+ local real_speed = self :get_speed (self .state )
134+ if self :get_velocity () < real_speed - 0.15 and vel .y == 0 then
135+ vel .y = 6
136+ self .object :setvelocity (vel )
137+ else
138+ self :set_velocity (real_speed )
139+ end
140+
138141 -- Env damage
139- self .env_damage_timer = self .env_damage_timer + dtime
140- if self .env_damage_timer >= 1 then
141- self .env_damage_timer = 0
142-
143- local light = minetest .get_node_light (my_pos ) or 16
144- local damage = 0
145-
146- if self .light_damage ~= 0 and my_pos .y > - 10 and light > 7 then
147- damage = self .light_damage
148- end
149- if self .water_damage ~= 0 and minetest .get_item_group (node , " water" ) ~= 0 then
150- damage = damage + self .water_damage
151- end
152- if self .lava_damage ~= 0 and minetest .get_item_group (node , " lava" ) ~= 0 then
153- damage = damage + self .lava_damage
154- end
155-
156- if damage ~= 0 then
157- self .object :set_hp (self .object :get_hp () - damage )
158- end
159-
160- if damage > 0 then
161- minetest .sound_play (" player_damage" , {object = self .object , gain = 0.25 })
162- if self .object :get_hp () <= 0 then
163- minetest .sound_play (" player_death" , {object = self .object , gain = 0.4 })
164- self .object :remove ()
165- return
166- end
142+ local light = minetest .get_node_light (my_pos ) or 16
143+ local damage = 0
144+
145+ if self .light_damage ~= 0 and my_pos .y > - 10 and light > 7 then
146+ damage = self .light_damage
147+ end
148+ if self .water_damage ~= 0 and minetest .get_item_group (node , " water" ) ~= 0 then
149+ damage = damage + self .water_damage
150+ end
151+ if self .lava_damage ~= 0 and minetest .get_item_group (node , " lava" ) ~= 0 then
152+ damage = damage + self .lava_damage
153+ end
154+
155+ if damage ~= 0 then
156+ self .object :set_hp (self .object :get_hp () - damage )
157+ end
158+
159+ if damage > 0 then
160+ minetest .sound_play (" player_damage" , {object = self .object , gain = 0.25 })
161+ if self .object :get_hp () <= 0 then
162+ minetest .sound_play (" player_death" , {object = self .object , gain = 0.4 })
163+ self .object :remove ()
164+ return
167165 end
168166 end
169167
@@ -175,7 +173,6 @@ function mobs:register_mob(name, def)
175173 dist = (vec .x ^ 2 + vec .y ^ 2 + vec .z ^ 2 ) ^ 0.5
176174
177175 if dist < self .view_range and player :get_hp () > 0 then
178- self .state = " attack"
179176 self .to_player = player
180177 break
181178 end
@@ -241,8 +238,6 @@ function mobs:register_mob(name, def)
241238
242239 if not self .v_start then
243240 self .v_start = true
244- else
245- self :do_jump ()
246241 end
247242
248243 local yaw = math.atan (vec .z / vec .x ) + math.pi / 2
@@ -263,22 +258,16 @@ function mobs:register_mob(name, def)
263258 end
264259
265260 if self .state == " stand" or self .state == " walk" then
266- local moving = (self .state == " walk" )
267261 local other_state = " walk"
268-
269- local r , r2 = math.random (15 ), 0
270- if moving then
271- if self :do_jump () == true then
272- r2 = math.random (10 )
273- end
262+ if self .state == " walk" then
274263 other_state = " stand"
275264 end
276265
266+ local r = math.random (30 )
277267 if r == 1 then
278268 self :set_animation (other_state )
279- elseif r == 2 or r2 == 2 then
269+ elseif r == 2 or r == 3 then
280270 self .object :setyaw (self .object :getyaw () + (math.random (- 90 , 90 ) / 180 * math.pi ))
281- self :set_animation (self .state )
282271 end
283272 end
284273 end ,
@@ -287,7 +276,7 @@ function mobs:register_mob(name, def)
287276 self .object :set_armor_groups ({fleshy = self .armor })
288277 self .object :setacceleration ({x = 0 , y = - 10 , z = 0 })
289278 self :set_animation (" stand" )
290- self .object :setyaw (math.random (360 ) / 180 * math.pi )
279+ self .object :setyaw (math.random (360 ) / 180 * math.pi )
291280 self .lifetimer = self .lifetimer - dtime_s
292281 if staticdata then
293282 local tmp = minetest .deserialize (staticdata )
0 commit comments