diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 6bd39b2cf..62100c627 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -217,6 +217,7 @@ function mcl_mobs.register_mob(name, def) replace_with = def.replace_with, replace_offset = def.replace_offset or 0, on_replace = def.on_replace, + replace_delay = def.replace_delay or 0, timer = 0, env_damage_timer = 0, tamed = false, @@ -490,7 +491,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg on_place = function(itemstack, placer, pointed_thing) local pos = pointed_thing.above - + -- am I clicking on something with existing on_rightclick function? local under = minetest.get_node(pointed_thing.under) local def = minetest.registered_nodes[under.name] diff --git a/mods/ENTITIES/mcl_mobs/movement.lua b/mods/ENTITIES/mcl_mobs/movement.lua index 377e25f6e..317ac9f28 100644 --- a/mods/ENTITIES/mcl_mobs/movement.lua +++ b/mods/ENTITIES/mcl_mobs/movement.lua @@ -355,9 +355,11 @@ function mob_class:do_jump() jump_c_multiplier = v2/self.walk_velocity/2 end + local yaw_dir = minetest.yaw_to_dir(self.object:get_yaw()) + -- where is front - local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)*jump_c_multiplier+0.6 - local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)*jump_c_multiplier+0.6 + local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)*jump_c_multiplier+yaw_dir.x + local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)*jump_c_multiplier+yaw_dir.z -- what is in front of mob? nod = node_ok({ @@ -480,6 +482,7 @@ end -- find and replace what mob is looking for (grass, wheat etc.) function mob_class:replace_node(pos) + if not self.replace_rate or not self.replace_what or self.child == true @@ -510,18 +513,21 @@ function mob_class:replace_node(pos) local oldnode = {name = what, param2 = node.param2} local newnode = {name = with, param2 = node.param2} - local on_replace_return - + local on_replace_return = false if self.on_replace then on_replace_return = self.on_replace(self, pos, oldnode, newnode) end + if on_replace_return ~= false then if mobs_griefing then - minetest.set_node(pos, newnode) + minetest.after(self.replace_delay, function() + if self and self.object and self.object:get_velocity() and self.health > 0 then + minetest.set_node(pos, newnode) + end + end) end - end end end diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 1fbe1e24d..e1b23d78a 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -184,7 +184,7 @@ function mob_class:collision() end function mob_class:check_death_and_slow_mob() - local d = 0.85 + local d = 0.7 local dying = self:check_dying() if dying then d = 0.92 end @@ -217,7 +217,7 @@ function mob_class:set_velocity(v) local vv = self.object:get_velocity() if vv and yaw then - self.acc = vector.new(((math.sin(yaw) * -v) + c_x) * .27, 0, ((math.cos(yaw) * v) + c_y) * .27) + self.acc = vector.new(((math.sin(yaw) * -v) + c_x) * .4, 0, ((math.cos(yaw) * v) + c_y) * .4) end end @@ -327,9 +327,9 @@ function mob_class:set_yaw(yaw, delay, dtime) end if math.deg(yaw) > 360 then - yaw=yaw%360 + yaw=math.rad(math.deg(yaw)%360) elseif math.deg(yaw) < 0 then - yaw=((360*5)-yaw)%360 + yaw=math.rad(((360*5)-math.deg(yaw))%360) end --calculate the shortest way to turn to find our target @@ -353,7 +353,7 @@ function mob_class:set_yaw(yaw, delay, dtime) ddtime = dtime end - if math.abs(target_shortest_path_nums) > 5 then + if math.abs(target_shortest_path_nums) > 10 then self.object:set_yaw(self.object:get_yaw()+(target_shortest_path*(3.6*ddtime))) if self.acc then self.acc=vector.rotate_around_axis(self.acc,vector.new(0,1,0), target_shortest_path*(3.6*ddtime)) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d index 7ee15fb55..31044fbaf 100644 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d and b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d differ diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index c71fa9b54..6c095fc9b 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -101,39 +101,45 @@ mcl_mobs.register_mob("mobs_mc:sheep", { stand_start = 0, stand_end = 0, walk_start = 0, walk_end = 40, walk_speed = 30, run_start = 0, run_end = 40, run_speed = 40, + eat_start = 40, eat_end = 80, eat_loop = false, }, child_animations = { stand_start = 81, stand_end = 81, walk_start = 81, walk_end = 121, walk_speed = 45, run_start = 81, run_end = 121, run_speed = 60, + eat_start = 121, eat_start = 161, eat_loop = false, }, follow = { "mcl_farming:wheat_item" }, view_range = 12, -- Eat grass - replace_rate = 20, + replace_rate = 80, + replace_delay = 1.3, replace_what = { { "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 }, { "mcl_flowers:tallgrass", "air", 0 }, }, -- Properly regrow wool after eating grass on_replace = function(self, pos, oldnode, newnode) - if not self.color or not colors[self.color] then - self.color = "unicolor_white" - end - self.gotten = false - self.base_texture = sheep_texture(self.color) - self.object:set_properties({ textures = self.base_texture }) - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - {name = colors[self.color][1], - chance = 1, - min = 1, - max = 1,}, - } + self.state = "eat" + self:set_animation("eat") + self:set_velocity(0) + minetest.after(self.replace_delay, function() + if self and self.object and self.object:get_velocity() and self.health > 0 then + self.object:set_velocity(vector.zero()) + if not self.color or not colors[self.color] then + self.color = "unicolor_white" + end + self.gotten = false + self.base_texture = sheep_texture(self.color) + self.object:set_properties({ textures = self.base_texture }) + end + end) + minetest.after(2.5, function() + if self and self.object and self.state == 'eat' and self.health > 0 and self.object:get_velocity() then + self.state = "walk" + end + end) end, -- Set random color on spawn @@ -226,12 +232,6 @@ mcl_mobs.register_mob("mobs_mc:sheep", { item:add_wear(mobs_mc.shears_wear) clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) end - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - } return end -- Dye sheep