Replace getpos() with get_pos()
[MineClone/MineClone2.git] / mods / ENTITIES / mobs_mc / ocelot.lua
blob58a7d94f9f55bc895efc34b2e46109adeaa8f84e
1 --MCmobs v0.4
2 --maikerumine
3 --made for MC like Survival game
4 --License for code WTFPL and otherwise stated in readmes
6 -- intllib
7 local MP = minetest.get_modpath(minetest.get_current_modname())
8 local S, NS = dofile(MP.."/intllib.lua")
10 --###################
11 --################### OCELOT AND CAT
12 --###################
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
22 return true
23 elseif string.sub(itemstring, 1, 6) == "group:" and minetest.get_item_group(itemstring, string.sub(itemstring, 7, -1)) ~= 0 then
24 return true
25 end
26 end
27 return false
28 end
30 -- Ocelot
31 local ocelot = {
32 type = "animal",
33 can_despawn = true,
34 hp_min = 10,
35 hp_max = 10,
36 collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3},
37 visual = "mesh",
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,
43 walk_velocity = 1,
44 run_velocity = 3,
45 floats = 1,
46 runaway = true,
47 water_damage = 0,
48 lava_damage = 4,
49 light_damage = 0,
50 fall_damage = 0,
51 fear_height = 4,
52 sounds = {
53 damage = "mobs_mc_ocelot_hurt",
54 death = "mobs_mc_ocelot_hurt",
55 distance = 16,
57 animation = {
58 speed_normal = 25,
59 speed_run = 50,
60 stand_start = 0,
61 stand_end = 0,
62 walk_start = 0,
63 walk_end = 40,
64 run_start = 0,
65 run_end = 40,
67 follow = mobs_mc.follow.ocelot,
68 view_range = 12,
69 passive = true,
70 attack_type = "dogfight",
71 pathfinding = 1,
72 damage = 2,
73 reach = 1,
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
82 item:take_item()
83 clicker:set_wielded_item(item)
84 end
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")
89 cat:set_yaw(yaw)
90 local ent = cat:get_luaentity()
91 ent.owner = clicker:get_player_name()
92 ent.tamed = true
93 self.object:remove()
94 return
95 end
96 end
98 end,
101 mobs:register_mob("mobs_mc:ocelot", ocelot)
103 -- Cat
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
107 cat.owner = ""
108 cat.order = "roam" -- "sit" or "roam"
109 cat.owner_loyal = true
110 cat.tamed = true
111 cat.runaway = false
112 -- Automatically teleport cat to owner
113 cat.do_custom = mobs_mc.make_owner_teleport_function(12)
114 cat.sounds = {
115 random = "mobs_mc_cat_idle",
116 damage = "mobs_mc_cat_hiss",
117 death = "mobs_mc_ocelot_hurt",
118 distance = 16,
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
135 self.order = "roam"
136 self.walk_chance = default_walk_chance
137 self.jump = true
138 else
139 -- “Sit!”
140 -- TODO: Add sitting model
141 self.order = "sit"
142 self.walk_chance = 0
143 self.jump = false
148 mobs:register_mob("mobs_mc:cat", cat)
150 local base_spawn_chance = 5000
152 -- Spawn ocelot
153 mobs:spawn({
154 name = "mobs_mc:ocelot",
155 nodes = mobs_mc.spawn.jungle,
156 neighbors = {"air"},
157 light_max = minetest.LIGHT_MAX+1,
158 light_min = 0,
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 },
174 collisionbox = {
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,
183 ent.child = true
186 -- Possible spawn offsets, two of these will get selected
187 local k = 0.7
188 local offsets = {
189 { x=k, y=0, z=0 },
190 { x=-k, y=0, z=0 },
191 { x=0, y=0, z=k },
192 { x=0, y=0, z=-k },
193 { x=k, y=0, z=k },
194 { x=k, y=0, z=-k },
195 { x=-k, y=0, z=k },
196 { x=-k, y=0, z=-k },
198 for i=1, 2 do
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"))
206 end,
209 -- compatibility
210 mobs:alias_mob("mobs:kitten", "mobs_mc:ocelot")
212 -- spawn eggs
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")