-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbreeding.lua
68 lines (61 loc) · 2.1 KB
/
breeding.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
local m = tigris.mobs
local fertile_threshold = 5
local fertile_timer = 10
local function is_fertile(obj)
local d = obj:get_luaentity()._data
return (d.fertile or 0) >= fertile_threshold and (minetest.get_gametime() - (d.fertile_timer or minetest.get_gametime())) > fertile_timer
end
local function set_fertile(obj, x)
obj:get_luaentity()._data.fertile = x
end
local function reset_fertile(obj)
set_fertile(obj, 0)
obj:get_luaentity()._data.fertile_timer = minetest.get_gametime()
end
local function name_in(name, list)
for _,v in ipairs(list) do
if v == name then
return true
end
end
return false
end
m.register_action("find_mate", {
func = function(self, context)
self._data.fertile_timer = self._data.fertile_timer or minetest.get_gametime()
if not is_fertile(self.object) then
return
end
local possible = {}
for _,obj in ipairs(minetest.get_objects_inside_radius(self.object:getpos(), 16)) do
if obj ~= self.object and obj:get_luaentity() and name_in(obj:get_luaentity().name, self.def.breedable or {self.def.name}) and is_fertile(obj) then
table.insert(possible, obj)
end
end
if #possible > 0 then
self.other = possible[math.random(#possible)]
return {name = "found"}
end
end,
})
m.register_state("breed", {
func = function(self, context)
if is_fertile(self.object) and is_fertile(self.other) then
reset_fertile(self.object)
reset_fertile(self.other)
local obj = tigris.mobs.spawn(context.def.name, self.object:getpos())
if obj then
obj:get_luaentity()._data.tame = true
minetest.log("Bred " .. context.def.name .. " at " .. minetest.pos_to_string(vector.round(self.object:getpos())))
end
return {name = "done"}
else
return {name = "gone"}
end
end,
})
local old = m.effects.eat
m.effects.eat = function(self)
old(self)
self._data.fertile = (self._data.fertile or 0) + 1
end