3 --made for MC like Survival game
4 --License for code WTFPL and otherwise stated in readmes
7 local MP
= minetest
.get_modpath(minetest
.get_current_modname())
8 local S
, NS
= dofile(MP
.."/intllib.lua")
11 --################### OCELOT AND CAT
14 local pr
= PseudoRandom(os
.time()*12)
16 local default_walk_chance
= 70
18 -- Returns true if the item is food (taming) for the cat/ocelot
19 local is_food
= function(itemstring
)
20 for f
=1, #mobs_mc
.follow
.ocelot
do
21 if itemstring
== mobs_mc
.follow
.ocelot
[f
] then
23 elseif string.sub(itemstring
, 1, 6) == "group:" and minetest
.get_item_group(itemstring
, string.sub(itemstring
, 7, -1)) ~= 0 then
36 collisionbox
= {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3},
38 mesh
= "mobs_mc_cat.b3d",
39 textures
= {"mobs_mc_cat_ocelot.png"},
40 visual_size
= {x
=2.0, y
=2.0},
41 makes_footstep_sound
= true,
42 walk_chance
= default_walk_chance
,
53 damage
= "mobs_mc_ocelot_hurt",
54 death
= "mobs_mc_ocelot_hurt",
67 follow
= mobs_mc
.follow
.ocelot
,
70 attack_type
= "dogfight",
74 attack_animals
= true,
75 specific_attack
= { "mobs_mc:chicken" },
76 on_rightclick
= function(self
, clicker
)
77 if self
.child
then return end
78 -- Try to tame ocelot (mobs:feed_tame is intentionally NOT used)
79 local item
= clicker
:get_wielded_item()
80 if is_food(item
:get_name()) then
81 if not minetest
.settings
:get_bool("creative_mode") then
83 clicker
:set_wielded_item(item
)
85 -- 1/3 chance of getting tamed
86 if pr
:next(1, 3) == 1 then
87 local yaw
= self
.object
:get_yaw()
88 local cat
= minetest
.add_entity(self
.object
:get_pos(), "mobs_mc:cat")
90 local ent
= cat
:get_luaentity()
91 ent
.owner
= clicker
:get_player_name()
101 mobs
:register_mob("mobs_mc:ocelot", ocelot
)
104 local cat
= table.copy(ocelot
)
105 cat
.textures
= {{"mobs_mc_cat_black.png"}, {"mobs_mc_cat_red.png"}, {"mobs_mc_cat_siamese.png"}}
106 cat
.can_despawn
= false
108 cat
.order
= "roam" -- "sit" or "roam"
109 cat
.owner_loyal
= true
112 -- Automatically teleport cat to owner
113 cat
.do_custom
= mobs_mc
.make_owner_teleport_function(12)
115 random = "mobs_mc_cat_idle",
116 damage
= "mobs_mc_cat_hiss",
117 death
= "mobs_mc_ocelot_hurt",
120 cat
.on_rightclick
= function(self
, clicker
)
121 if mobs
:feed_tame(self
, clicker
, 1, true, false) then return end
122 if mobs
:capture_mob(self
, clicker
, 0, 60, 5, false, nil) then return end
123 if mobs
:protect(self
, clicker
) then return end
125 if self
.child
then return end
127 -- Toggle sitting order
129 if not self
.owner
or self
.owner
== "" then
130 -- Huh? This cat has no owner? Let's fix this! This should never happen.
131 self
.owner
= clicker
:get_player_name()
134 if not self
.order
or self
.order
== "" or self
.order
== "sit" then
136 self
.walk_chance
= default_walk_chance
140 -- TODO: Add sitting model
148 mobs
:register_mob("mobs_mc:cat", cat
)
150 local base_spawn_chance
= 5000
154 name
= "mobs_mc:ocelot",
155 nodes
= mobs_mc
.spawn
.jungle
,
157 light_max
= minetest
.LIGHT_MAX
+1,
159 chance
= math
.ceil(base_spawn_chance
* 1.5), -- emulates 1/3 spawn failure rate
160 active_object_count
= 12,
161 min_height
= mobs_mc
.spawn_height
.water
+1, -- Right above ocean level
162 max_height
= mobs_mc
.spawn_height
.overworld_max
,
163 on_spawn
= function(self
, pos
)
164 --[[ Note: Minecraft has a 1/3 spawn failure rate.
165 In this mod it is emulated by reducing the spawn rate accordingly (see above). ]]
167 -- 1/7 chance to spawn 2 ocelot kittens
168 if pr
:next(1,7) == 1 then
169 -- Turn object into a child
170 local make_child
= function(object
)
171 local ent
= object
:get_luaentity()
172 object
:set_properties({
173 visual_size
= { x
= ent
.base_size
.x
/2, y
= ent
.base_size
.y
/2 },
175 ent
.base_colbox
[1]/2,
176 ent
.base_colbox
[2]/2,
177 ent
.base_colbox
[3]/2,
178 ent
.base_colbox
[4]/2,
179 ent
.base_colbox
[5]/2,
180 ent
.base_colbox
[6]/2,
186 -- Possible spawn offsets, two of these will get selected
199 local o
= pr
:next(1, #offsets
)
200 local offset
= offsets
[o
]
201 local child_pos
= vector
.add(pos
, offsets
[o
])
202 table.remove(offsets
, o
)
203 make_child(minetest
.add_entity(child_pos
, "mobs_mc:ocelot"))
210 mobs
:alias_mob("mobs:kitten", "mobs_mc:ocelot")
213 -- FIXME: The spawn icon shows a cat texture, not an ocelot texture
214 mobs
:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0)
216 if minetest
.settings
:get_bool("log_mods") then
217 minetest
.log("action", "MC Ocelot loaded")