local S = mobs.intllib -- Duck by JK Murray and Tirifto mobs:register_mob("mobs_animal:duck", { type = "animal", passive = true, hp_min = 10, hp_max = 40, armor = 200, collisionbox = {-0.3, -0.75, -0.3, 0.3, 0.1, 0.3}, visual = "mesh", mesh = "mobs_chicken.x", -- seems a lot of textures but this fixes the problem with the model textures = { {"mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png", "mobs_duck_drake.png"}, {"mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png", "mobs_duck_female.png"}, }, child_texture = { {"mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png", "mobs_chick.png"}, }, makes_footstep_sound = true, sounds = { random = "mobs_duck", }, walk_velocity = 3, run_velocity = 5, runaway = true, drops = { {name = "mobs:duck_raw", chance = 3, min = 1, max = 2}, {name = "mobs:chicken_feather", chance = 5, min = 1, max = 3}, }, water_damage = 0, lava_damage = 5, light_damage = 0, fall_damage = 0, fall_speed = -8, fear_height = 100, animation = { speed_normal = 15, stand_start = 0, stand_end = 1, -- 20 walk_start = 20, walk_end = 40, }, floats = 1, follow = {"farming:wheat_seed", "farming:cotton_seed"}, view_range = 5, on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 8, true, true) then return end if mobs:protect(self, clicker) then return end if mobs:capture_mob(self, clicker, 30, 50, 80, false, nil) then return end end, do_custom = function(self, dtime) self.egg_timer = (self.egg_timer or 0) + dtime if self.egg_timer < 10 then return end self.egg_timer = 0 if self.child or math.random(1, 100) > 1 then return end local pos = self.object:getpos() minetest.add_item(pos, "mobs:duck_egg") minetest.sound_play("default_place_node_hard", { pos = pos, gain = 1.0, max_hear_distance = 5, }) end, }) local spawn_on = "default:water_source" if minetest.get_modpath("ethereal") then spawn_on = "ethereal:bamboo_dirt" end mobs:spawn({ name = "mobs_animal:duck", nodes = {spawn_on}, min_light = 5, chance = 15000, active_object_count = 2, min_height = 0, day_toggle = true, }) mobs:register_egg("mobs_animal:duck", S("Duck"), "mobs_duck_inv.png", 0) mobs:alias_mob("mobs:duck", "mobs_animal:duck") -- compatibility -- duck egg entity mobs:register_arrow("mobs_animal:duck_egg_entity", { visual = "sprite", visual_size = {x=.5, y=.5}, textures = {"mobs_duck_egg.png"}, velocity = 6, hit_player = function(self, player) player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 1}, }, nil) end, hit_mob = function(self, player) player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 1}, }, nil) end, hit_node = function(self, pos, node) if math.random(1, 10) > 1 then return end pos.y = pos.y + 1 local nod = minetest.get_node_or_nil(pos) if not nod or not minetest.registered_nodes[nod.name] or minetest.registered_nodes[nod.name].walkable == true then return end local mob = minetest.add_entity(pos, "mobs_animal:duck") local ent2 = mob:get_luaentity() mob:set_properties({ textures = ent2.child_texture[1], visual_size = { x = ent2.base_size.x / 2, y = ent2.base_size.y / 2 }, collisionbox = { ent2.base_colbox[1] / 2, ent2.base_colbox[2] / 2, ent2.base_colbox[3] / 2, ent2.base_colbox[4] / 2, ent2.base_colbox[5] / 2, ent2.base_colbox[6] / 2 }, }) ent2.child = true ent2.tamed = true ent2.owner = self.playername end }) -- egg throwing item local egg_GRAVITY = 9 local egg_VELOCITY = 19 -- shoot egg local mobs_shoot_egg = function (item, player, pointed_thing) local playerpos = player:getpos() minetest.sound_play("default_place_node_hard", { pos = playerpos, gain = 1.0, max_hear_distance = 5, }) local obj = minetest.add_entity({ x = playerpos.x, y = playerpos.y +1.5, z = playerpos.z }, "mobs_animal:duck_egg_entity") local ent = obj:get_luaentity() local dir = player:get_look_dir() ent.velocity = egg_VELOCITY -- needed for api internal timing ent.switch = 1 -- needed so that egg doesn't despawn straight away obj:setvelocity({ x = dir.x * egg_VELOCITY, y = dir.y * egg_VELOCITY, z = dir.z * egg_VELOCITY }) obj:setacceleration({ x = dir.x * -3, y = -egg_GRAVITY, z = dir.z * -3 }) -- pass player name to egg for chick ownership local ent2 = obj:get_luaentity() ent2.playername = player:get_player_name() item:take_item() return item end -- egg minetest.register_node(":mobs:duck_egg", { description = S("Duck Egg"), tiles = {"mobs_duck_egg.png"}, inventory_image = "mobs_duck_egg.png", visual_scale = 0.7, drawtype = "plantlike", wield_image = "mobs_duck_egg.png", paramtype = "light", walkable = false, is_ground_content = true, sunlight_propagates = true, selection_box = { type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} }, groups = {snappy = 2, dig_immediate = 3}, after_place_node = function(pos, placer, itemstack) if placer:is_player() then minetest.set_node(pos, {name = "mobs:duck_egg", param2 = 1}) end end, on_use = mobs_shoot_egg }) minetest.register_craft({ type = "cooking", recipe = "mobs:duck_egg", output = "mobs:chicken_egg_fried", }) -- raw chicken minetest.register_craftitem(":mobs:duck_raw", { description = S("Raw Duck"), inventory_image = "mobs_duck_raw.png", on_use = minetest.item_eat(3), }) -- cooked chicken minetest.register_craftitem(":mobs:duck_cooked", { description = S("Cooked Duck"), inventory_image = "mobs_duck_cooked.png", on_use = minetest.item_eat(9), }) minetest.register_craft({ type = "cooking", recipe = "mobs:duck_raw", output = "mobs:duck_cooked", }) -- feather minetest.register_craftitem(":mobs:chicken_feather", { description = S("Feather"), inventory_image = "mobs_chicken_feather.png", })