--MCmobs v0.4 --maikerumine --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") --################### --################### OCELOT AND CAT --################### local pr = PseudoRandom(os.time()*12) local default_walk_chance = 70 local follow = { "mcl_fishing:fish_raw", "mcl_fishing:salmon_raw", "mcl_fishing:clownfish_raw", "mcl_fishing:pufferfish_raw", } local function is_food(itemstring) return table.indexof(follow, itemstring) ~= -1 end -- Ocelot local ocelot = { description = S("Ocelot"), type = "animal", spawn_class = "passive", can_despawn = true, spawn_in_group = 3, spawn_in_group_min = 1, hp_min = 10, hp_max = 10, xp_min = 1, xp_max = 3, head_swivel = "head.control", head_eye_height = 0.4, head_bone_position = vector.new( 0, 6.44, -0.42 ), -- for minetest <= 5.8 head_yaw="z", curiosity = 4, collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3}, visual = "mesh", mesh = "mobs_mc_cat.b3d", textures = {"mobs_mc_cat_ocelot.png"}, makes_footstep_sound = true, walk_chance = default_walk_chance, walk_velocity = 1, run_velocity = 3, follow_velocity = 1, floats = 1, runaway = true, fall_damage = 0, fear_height = 4, sounds = { damage = "mobs_mc_ocelot_hurt", death = "mobs_mc_ocelot_hurt", eat = "mobs_mc_animal_eat_generic", distance = 16, }, animation = { stand_start = 0, stand_end = 0, walk_start = 0, walk_end = 40, walk_speed = 40, run_start = 0, run_end = 40, run_speed = 50, sit_start = 50, sit_end = 50, }, child_animations = { stand_start = 51, stand_end = 51, walk_start = 51, walk_end = 91, walk_speed = 60, run_start = 51, run_end = 91, run_speed = 75, sit_start = 101, sit_end = 101, }, follow = follow, view_range = 12, passive = true, attack_type = "dogfight", pathfinding = 1, damage = 2, reach = 1, attack_animals = true, specific_attack = { "mobs_mc:chicken" }, on_rightclick = function(self, clicker) if self.child then return end -- Try to tame ocelot (mobs:feed_tame is intentionally NOT used) local item = clicker:get_wielded_item() if is_food(item:get_name()) then if not minetest.is_creative_enabled(clicker:get_player_name()) then item:take_item() clicker:set_wielded_item(item) end -- 1/3 chance of getting tamed if pr:next(1, 3) == 1 then local yaw = self.object:get_yaw() local cat = minetest.add_entity(self.object:get_pos(), "mobs_mc:cat") cat:set_yaw(yaw) local ent = cat:get_luaentity() ent.owner = clicker:get_player_name() ent.tamed = true self.object:remove() return end end end, } mcl_mobs.register_mob("mobs_mc:ocelot", ocelot) -- Cat local cat = table.copy(ocelot) cat.description = S("Cat") cat.textures = {{"mobs_mc_cat_black.png"}, {"mobs_mc_cat_red.png"}, {"mobs_mc_cat_siamese.png"}} cat.can_despawn = false cat.owner = "" cat.order = "roam" -- "sit" or "roam" cat.owner_loyal = true cat.tamed = true cat.runaway = false cat.follow_velocity = 2.4 -- Automatically teleport cat to owner cat.do_custom = mobs_mc.make_owner_teleport_function(12) cat.sounds = { random = "mobs_mc_cat_idle", damage = "mobs_mc_cat_hiss", death = "mobs_mc_ocelot_hurt", eat = "mobs_mc_animal_eat_generic", distance = 16, } cat.on_rightclick = function(self, clicker) if self:feed_tame(clicker, 1, true, false) then return end if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end if mcl_mobs:protect(self, clicker) then return end if self.child then return end -- Toggle sitting order if not self.owner or self.owner == "" then -- Huh? This cat has no owner? Let's fix this! This should never happen. self.owner = clicker:get_player_name() end if not self.order or self.order == "" or self.order == "sit" then self.order = "roam" self.walk_chance = default_walk_chance self.jump = true else -- “Sit!” -- TODO: Add sitting model self.order = "sit" self.walk_chance = 0 self.jump = false end end cat.on_spawn = function(self) if self.owner == "!witch!" then self._texture = {"mobs_mc_cat_black.png"} end if not self._texture then self._texture = cat.textures[math.random(#cat.textures)] end self.object:set_properties({textures = self._texture}) end mcl_mobs.register_mob("mobs_mc:cat", cat) local base_spawn_chance = 5000 -- Spawn ocelot --they get the same as the llama because I'm trying to rework so much of this code right now -j4i mcl_mobs:spawn_specific( "mobs_mc:ocelot", "overworld", "ground", { "Jungle", "JungleEdgeM", "JungleM", "JungleEdge", }, 0, minetest.LIGHT_MAX+1, 30, 300, 5, mobs_mc.water_level+15, mcl_vars.mg_overworld_max) --[[ mobs:spawn({ name = "mobs_mc:ocelot", nodes = { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, neighbors = {"air"}, light_max = minetest.LIGHT_MAX+1, light_min = 0, chance = math.ceil(base_spawn_chance * 1.5), -- emulates 1/3 spawn failure rate active_object_count = 12, min_height = mobs_mc.water_level+1, -- Right above ocean level max_height = mcl_vars.mg_overworld_max, on_spawn = function(self, pos) Note: Minecraft has a 1/3 spawn failure rate. In this mod it is emulated by reducing the spawn rate accordingly (see above). -- 1/7 chance to spawn 2 ocelot kittens if pr:next(1,7) == 1 then -- Turn object into a child local make_child = function(object) local ent = object:get_luaentity() object:set_properties({ visual_size = { x = ent.base_size.x/2, y = ent.base_size.y/2 }, collisionbox = { ent.base_colbox[1]/2, ent.base_colbox[2]/2, ent.base_colbox[3]/2, ent.base_colbox[4]/2, ent.base_colbox[5]/2, ent.base_colbox[6]/2, } }) ent.child = true end -- Possible spawn offsets, two of these will get selected local k = 0.7 local offsets = { { x=k, y=0, z=0 }, { x=-k, y=0, z=0 }, { x=0, y=0, z=k }, { x=0, y=0, z=-k }, { x=k, y=0, z=k }, { x=k, y=0, z=-k }, { x=-k, y=0, z=k }, { x=-k, y=0, z=-k }, } for i=1, 2 do local o = pr:next(1, #offsets) local offset = offsets[o] local child_pos = vector.add(pos, offsets[o]) table.remove(offsets, o) make_child(minetest.add_entity(child_pos, "mobs_mc:ocelot")) end end end, }) ]]-- -- spawn eggs mcl_mobs.register_egg("mobs_mc:ocelot", S("Ocelot"), "#efde7d", "#564434", 0)