Add some despawning logic (but do not enable despawning yet)
[MineClone/MineClone2.git] / mods / ENTITIES / mobs_mc / wolf.lua
blob934fd753c323e79c8ae9bfa0e10e0ea1e8ba3ae0
1 --License for code WTFPL and otherwise stated in readmes
3 -- intllib
4 local MP = minetest.get_modpath(minetest.get_current_modname())
5 local S, NS = dofile(MP.."/intllib.lua")
7 local default_walk_chance = 50
9 local pr = PseudoRandom(os.time()*10)
11 local is_food = function(itemstring)
12 for f=1, #mobs_mc.follow.dog do
13 if itemstring == mobs_mc.follow.dog[f] then
14 return true
15 elseif string.sub(itemstring, 1, 6) == "group:" and minetest.get_item_group(itemstring, string.sub(itemstring, 7, -1)) ~= 0 then
16 return true
17 end
18 end
19 return false
20 end
22 -- Wolf
23 local wolf = {
24 type = "animal",
25 can_despawn = true,
26 hp_min = 8,
27 hp_max = 8,
28 passive = false,
29 group_attack = true,
30 collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3},
31 visual = "mesh",
32 mesh = "mobs_mc_wolf.b3d",
33 textures = {
34 {"mobs_mc_wolf.png"},
36 visual_size = {x=3, y=3},
37 makes_footstep_sound = true,
38 sounds = {
39 war_cry = "mobs_wolf_attack",
40 distance = 16,
42 pathfinding = 1,
43 floats = 1,
44 view_range = 16,
45 walk_chance = default_walk_chance,
46 walk_velocity = 2,
47 run_velocity = 3,
48 stepheight = 1.1,
49 damage = 4,
50 reach = 2,
51 attack_type = "dogfight",
52 fear_height = 4,
53 water_damage = 0,
54 lava_damage = 4,
55 light_damage = 0,
56 follow = mobs_mc.follow.wolf,
57 on_rightclick = function(self, clicker)
58 -- Try to tame wolf (intentionally does NOT use mobs:feed_tame)
59 local tool = clicker:get_wielded_item()
61 local dog, ent
62 if tool:get_name() == mobs_mc.items.bone then
64 if not minetest.settings:get_bool("creative_mode") then
65 tool:take_item()
66 clicker:set_wielded_item(tool)
67 end
68 -- 1/3 chance of getting tamed
69 if pr:next(1, 3) == 1 then
70 local yaw = self.object:get_yaw()
71 dog = minetest.add_entity(self.object:getpos(), "mobs_mc:dog")
72 dog:set_yaw(yaw)
73 ent = dog:get_luaentity()
74 ent.owner = clicker:get_player_name()
75 self.object:remove()
76 end
77 end
78 end,
79 animation = {
80 speed_normal = 50, speed_run = 100,
81 stand_start = 40, stand_end = 45,
82 walk_start = 0, walk_end = 40,
83 run_start = 0, run_end = 40,
85 jump = true,
86 attacks_monsters = true,
87 attack_animals = true,
88 specific_attack = { "player", "mobs_mc:sheep" },
91 mobs:register_mob("mobs_mc:wolf", wolf)
93 -- Tamed wolf
95 -- Collar colors
96 local colors = {
97 ["unicolor_black"] = "#000000",
98 ["unicolor_blue"] = "#0000BB",
99 ["unicolor_dark_orange"] = "#663300", -- brown
100 ["unicolor_cyan"] = "#01FFD8",
101 ["unicolor_dark_green"] = "#005B00",
102 ["unicolor_grey"] = "#C0C0C0",
103 ["unicolor_darkgrey"] = "#303030",
104 ["unicolor_green"] = "#00FF01",
105 ["unicolor_red_violet"] = "#FF05BB", -- magenta
106 ["unicolor_orange"] = "#FF8401",
107 ["unicolor_light_red"] = "#FF65B5", -- pink
108 ["unicolor_red"] = "#FF0000",
109 ["unicolor_violet"] = "#5000CC",
110 ["unicolor_white"] = "#FFFFFF",
111 ["unicolor_yellow"] = "#FFFF00",
113 ["unicolor_light_blue"] = "#B0B0FF",
116 local get_dog_textures = function(color)
117 if colors[color] then
118 return {"mobs_mc_wolf_tame.png^(mobs_mc_wolf_collar.png^[colorize:"..colors[color]..":192)"}
119 else
120 return nil
124 -- Tamed wolf (aka “dog”)
125 local dog = table.copy(wolf)
126 dog.can_despawn = false
127 dog.passive = true
128 dog.hp_min = 20
129 dog.hp_max = 20
130 -- Tamed wolf texture + red collar
131 dog.textures = get_dog_textures("unicolor_red")
132 dog.owner = ""
133 -- TODO: Start sitting by default
134 dog.order = "roam"
135 dog.owner_loyal = true
136 -- Automatically teleport dog to owner
137 dog.do_custom = mobs_mc.make_owner_teleport_function(12)
138 dog.follow = mobs_mc.follow.dog
139 dog.attack_animals = nil
140 dog.specific_attack = nil
141 dog.on_rightclick = function(self, clicker)
142 local item = clicker:get_wielded_item()
144 if mobs:protect(self, clicker) then
145 return
146 elseif item:get_name() ~= "" and mobs:capture_mob(self, clicker, 0, 2, 80, false, nil) then
147 return
148 elseif is_food(item:get_name()) then
149 -- Feed to increase health
150 local hp = self.health
151 local hp_add = 0
152 -- Use eatable group to determine health boost
153 local eatable = minetest.get_item_group(item, "eatable")
154 if eatable > 0 then
155 hp_add = eatable
156 elseif item:get_name() == mobs_mc.items.rotten_flesh then
157 hp_add = 4
158 else
159 hp_add = 4
161 local new_hp = hp + hp_add
162 if new_hp > self.hp_max then
163 new_hp = self.hp_max
165 if not minetest.settings:get_bool("creative_mode") then
166 item:take_item()
167 clicker:set_wielded_item(item)
169 self.health = new_hp
170 return
171 elseif minetest.get_item_group(item:get_name(), "dye") == 1 then
172 -- Dye (if possible)
173 for group, _ in pairs(colors) do
174 -- Check if color is supported
175 if minetest.get_item_group(item:get_name(), group) == 1 then
176 -- Dye collar
177 local tex = get_dog_textures(group)
178 if tex then
179 self.base_texture = tex
180 self.object:set_properties({
181 textures = self.base_texture
183 if not minetest.settings:get_bool("creative_mode") then
184 item:take_item()
185 clicker:set_wielded_item(item)
187 break
191 else
192 -- Toggle sitting order
194 if not self.owner or self.owner == "" then
195 -- Huh? This wolf has no owner? Let's fix this! This should never happen.
196 self.owner = clicker:get_player_name()
199 if not self.order or self.order == "" or self.order == "sit" then
200 self.order = "roam"
201 self.walk_chance = default_walk_chance
202 self.jump = true
203 else
204 -- TODO: Add sitting model
205 self.order = "sit"
206 self.walk_chance = 0
207 self.jump = false
212 mobs:register_mob("mobs_mc:dog", dog)
214 -- Spawn
215 mobs:spawn_specific("mobs_mc:wolf", mobs_mc.spawn.wolf, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 9000, 20, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max)
217 -- Compatibility
218 mobs:alias_mob("mobs:wolf", "mobs_mc:wolf")
219 mobs:alias_mob("mobs:dog", "mobs_mc:dog")
220 mobs:alias_mob("esmobs:wolf", "mobs_mc:wolf")
221 mobs:alias_mob("esmobs:dog", "mobs_mc:dog")
223 mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0)
225 if minetest.settings:get_bool("log_mods") then
226 minetest.log("action", "MC Wolf loaded")