Add more beehive status messages

This commit is contained in:
Wuzzy 2023-06-30 00:45:36 +02:00
parent 443f748df8
commit bfc07a425f

View File

@ -1,14 +1,33 @@
local hive = {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local honey_max = 16
local HONEY_MAX = 16
local NEEDED_FLOWERS = 3
local TIMER_MIN = 64
local TIMER_MAX = 128
function hive.construct(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
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
local formspec = "size[8,6;]"
.."label[0.5,0;"..FS("Bees are busy making honey…").."]"
.."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;]
@ -16,18 +35,53 @@ function hive.construct(pos)
listring[current_player;main]
listring[context;honey] ]] ..
xbg .. default.get_hotbar_bg(0,2.35)
meta:set_string("formspec", formspec)
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"))
inv:set_size("honey", 1)
local timer = minetest.get_node_timer(pos)
timer:start(math.random(64, 128))
timer:start(math.random(TIMER_MIN, TIMER_MAX))
end
function hive.timer(pos)
local time = (minetest.get_timeofday() or 0) * 24000
if time < 5500 or time > 18500 then
local meta = minetest.get_meta(pos)
if is_sleeptime() then
hive.set_formspec(meta, "sleep")
return true
end
@ -35,18 +89,26 @@ function hive.timer(pos)
local honeystack = inv:get_stack("honey", 1)
local honey = honeystack:get_count()
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")
local flowers = count_flowers(pos)
if #flowers > 2 and honey < honey_max then
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
inv:add_item("honey", "xdecor:honey")
elseif honey == honey_max then
elseif honey == HONEY_MAX then
hive.set_formspec(meta, "idle")
local timer = minetest.get_node_timer(pos)
timer:stop()
return true
end
if flowers == 0 then
hive.set_formspec(meta, "noflowers")
elseif flowers < NEEDED_FLOWERS then
hive.set_formspec(meta, "fewflowers")
end
return true
end
@ -74,9 +136,13 @@ xdecor.register("hive", {
end,
on_metadata_inventory_take = function(pos, _, _, stack)
if stack:get_count() == honey_max then
if stack:get_count() == HONEY_MAX then
local timer = minetest.get_node_timer(pos)
timer:start(math.random(64, 128))
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
})