From bfc07a425fb5b7d3321639a2e77a1c966aff9c08 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 30 Jun 2023 00:45:36 +0200 Subject: [PATCH] Add more beehive status messages --- src/hive.lua | 100 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 17 deletions(-) diff --git a/src/hive.lua b/src/hive.lua index 2aa9910..743a951 100644 --- a/src/hive.lua +++ b/src/hive.lua @@ -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 })