xdecor-libre/src/hive.lua

175 lines
4.4 KiB
Lua
Raw Normal View History

2015-08-06 21:19:42 +02:00
local hive = {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
2023-06-30 00:45:36 +02:00
local HONEY_MAX = 16
local NEEDED_FLOWERS = 3
local TIMER_MIN = 64
local TIMER_MAX = 128
local text_busy = FS("The bees are busy making honey.")
local text_noflowers = FS("The bees are looking for flowers.")
local text_fewflowers = FS("The bees want to pollinate more flowers.")
local text_idle = FS("The bees are idle.")
local text_sleep = FS("The bees are resting.")
function hive.set_formspec(meta, status)
local statustext
if status == "busy" then
statustext = text_busy
elseif status == "noflowers" then
statustext = text_noflowers
elseif status == "fewflowers" then
statustext = text_fewflowers
elseif status == "idle" then
statustext = text_idle
elseif status == "sleep" then
statustext = text_sleep
end
2015-08-16 21:57:17 +02:00
local formspec = "size[8,6;]"
2023-06-30 00:45:36 +02:00
.."label[0.5,0;"..statustext.."]"
..[[ image[6,1;1,1;hive_bee.png]
image[5,1;1,1;hive_layout.png]
list[context;honey;5,1;1,1;]
list[current_player;main;0,2.35;8,4;]
listring[current_player;main]
2019-07-23 14:03:20 +02:00
listring[context;honey] ]] ..
xbg .. default.get_hotbar_bg(0,2.35)
2016-01-03 13:58:29 +01:00
meta:set_string("formspec", formspec)
2023-06-30 00:45:36 +02:00
end
local function count_flowers(pos)
local radius = 4
local minp = vector.add(pos, -radius)
local maxp = vector.add(pos, radius)
local flowers = minetest.find_nodes_in_area_under_air(minp, maxp, "group:flower")
return #flowers
end
local function is_sleeptime()
local time = (minetest.get_timeofday() or 0) * 24000
if time < 5500 or time > 18500 then
return true
else
return false
end
end
function hive.construct(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local status = "idle"
local flowers = count_flowers(pos)
if is_sleeptime() then
status = "sleep"
elseif flowers >= NEEDED_FLOWERS then
status = "busy"
elseif flowers > 0 then
status = "fewflowers"
else
status = "noflowers"
end
hive.set_formspec(meta, status)
meta:set_string("infotext", S("Artificial Hive"))
2015-07-05 01:38:12 +02:00
inv:set_size("honey", 1)
2016-03-08 14:35:51 +01:00
local timer = minetest.get_node_timer(pos)
2023-06-30 00:45:36 +02:00
timer:start(math.random(TIMER_MIN, TIMER_MAX))
2016-03-08 14:35:51 +01:00
end
function hive.timer(pos)
2023-06-30 00:45:36 +02:00
local meta = minetest.get_meta(pos)
if is_sleeptime() then
hive.set_formspec(meta, "sleep")
2019-07-23 14:03:20 +02:00
return true
end
2016-03-08 14:35:51 +01:00
local inv = minetest.get_meta(pos):get_inventory()
2016-03-08 14:35:51 +01:00
local honeystack = inv:get_stack("honey", 1)
local honey = honeystack:get_count()
2023-06-30 00:45:36 +02:00
local flowers = count_flowers(pos)
2016-03-08 14:35:51 +01:00
2023-06-30 00:45:36 +02:00
if flowers >= NEEDED_FLOWERS and honey < HONEY_MAX then
if honey == HONEY_MAX - 1 then
hive.set_formspec(meta, "idle")
else
hive.set_formspec(meta, "busy")
end
2016-03-08 14:35:51 +01:00
inv:add_item("honey", "xdecor:honey")
2023-06-30 00:45:36 +02:00
elseif honey == HONEY_MAX then
hive.set_formspec(meta, "idle")
local timer = minetest.get_node_timer(pos)
2019-07-23 14:03:20 +02:00
timer:stop()
return true
2016-03-08 14:35:51 +01:00
end
2023-06-30 00:45:36 +02:00
if flowers == 0 then
hive.set_formspec(meta, "noflowers")
elseif flowers < NEEDED_FLOWERS then
hive.set_formspec(meta, "fewflowers")
end
2019-07-23 14:03:20 +02:00
2016-03-08 14:35:51 +01:00
return true
2015-07-05 01:38:12 +02:00
end
xdecor.register("hive", {
description = S("Artificial Hive"),
2016-02-20 12:32:53 +01:00
tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png",
"xdecor_hive_side.png", "xdecor_hive_side.png",
"xdecor_hive_side.png", "xdecor_hive_front.png"},
2015-11-15 22:55:12 +01:00
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
2015-08-06 21:19:42 +02:00
on_construct = hive.construct,
2016-03-08 14:35:51 +01:00
on_timer = hive.timer,
2019-07-23 14:03:20 +02:00
2016-01-07 22:33:54 +01:00
can_dig = function(pos)
2016-03-08 14:35:51 +01:00
local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("honey")
end,
2019-07-23 14:03:20 +02:00
2016-01-03 13:58:29 +01:00
on_punch = function(_, _, puncher)
puncher:set_hp(puncher:get_hp() - 2)
end,
2019-07-23 14:03:20 +02:00
allow_metadata_inventory_put = function()
return 0
end,
on_metadata_inventory_take = function(pos, _, _, stack)
2023-06-30 00:45:36 +02:00
if stack:get_count() == HONEY_MAX then
local timer = minetest.get_node_timer(pos)
2023-06-30 00:45:36 +02:00
timer:start(math.random(TIMER_MIN, TIMER_MAX))
if not is_sleeptime() and count_flowers(pos) >= NEEDED_FLOWERS then
local meta = minetest.get_meta(pos)
hive.set_formspec(meta, "busy")
end
end
end
2015-07-05 01:38:12 +02:00
})
-- Craft items
minetest.register_craftitem("xdecor:honey", {
description = S("Honey"),
inventory_image = "xdecor_honey.png",
wield_image = "xdecor_honey.png",
2019-07-23 14:03:20 +02:00
on_use = minetest.item_eat(2),
groups = {
food_honey = 1,
food_sugar = 1,
flammable = 2,
not_in_creative_inventory = 1,
},
})
-- Recipes
minetest.register_craft({
output = "xdecor:hive",
recipe = {
{"group:stick", "group:stick", "group:stick"},
{"default:paper", "default:paper", "default:paper"},
{"group:stick", "group:stick", "group:stick"}
}
})