Refactor hopper -> composter ABMs

This commit is contained in:
AFCMS 2022-11-13 23:27:21 +01:00
parent 47eda5b69e
commit 7deec7ae03
No known key found for this signature in database
GPG Key ID: 8720389A25B652E3
2 changed files with 65 additions and 60 deletions

View File

@ -603,17 +603,53 @@ if minetest.get_modpath("mcl_composters") then
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local uppos = vector.offset(pos, 0, 1, 0) local uppos = vector.offset(pos, 0, 1, 0)
--local downpos = vector.offset(pos, 0, -1, 0) --local downpos = vector.offset(pos, 0, -1, 0)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
-- Get bonemeal from composter above -- Get bonemeal from composter above
local upnode = minetest.get_node(uppos) local upnode = minetest.get_node(uppos)
if upnode.name == "mcl_composters:composter_ready" then if upnode.name == "mcl_composters:composter_ready" then
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
minetest.swap_node(uppos, { name = "mcl_composters:composter" }) minetest.swap_node(uppos, { name = "mcl_composters:composter" })
inv:add_item("main", "mcl_dye:white") inv:add_item("main", "mcl_dye:white")
end end
end, end,
}) })
---@param node node
---@return integer?
---@nodiscard
local function composter_level(node)
local nn = node.name
if nn == "mcl_composters:composter" then
return 0
elseif nn == "mcl_composters:composter_1" then
return 1
elseif nn == "mcl_composters:composter_2" then
return 2
elseif nn == "mcl_composters:composter_3" then
return 3
elseif nn == "mcl_composters:composter_4" then
return 4
elseif nn == "mcl_composters:composter_5" then
return 5
elseif nn == "mcl_composters:composter_6" then
return 6
elseif nn == "mcl_composters:composter_7" then
return 7
else
return nil
end
end
for i = 1, 7 do
assert(composter_level({ name = "mcl_composters:composter_" .. i }) == i)
end
assert(composter_level({ name = "mcl_composters:composter" }) == 0)
assert(composter_level({ name = "mcl_composters:some_other_node" }) == nil)
minetest.register_abm({ minetest.register_abm({
label = "Add compostable items on composter", label = "Add compostable items on composter",
nodenames = { "mcl_hoppers:hopper" }, nodenames = { "mcl_hoppers:hopper" },
@ -632,66 +668,35 @@ if minetest.get_modpath("mcl_composters") then
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
--local uppos = vector.offset(pos, 0, 1, 0) --local uppos = vector.offset(pos, 0, 1, 0)
local downpos = vector.offset(pos, 0, -1, 0) local downpos = vector.offset(pos, 0, -1, 0)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
--Consume compostable items and update composter below
local downnode = minetest.get_node(downpos) local downnode = minetest.get_node(downpos)
if downnode.name == "mcl_composters:composter" or downnode.name == "mcl_composters:composter_1"
or downnode.name == "mcl_composters:composter_2" or downnode.name == "mcl_composters:composter_3" ---@type integer|string|nil
or downnode.name == "mcl_composters:composter_4" or downnode.name == "mcl_composters:composter_5" local level = composter_level(downnode)
or downnode.name == "mcl_composters:composter_6" or downnode.name == "mcl_composters:composter_7" then
local itemcomp = inv:get_list("main") --Consume compostable items and update composter below
local hslot = mcl_util.get_first_occupied_inventory_slot(minetest.get_inventory({ type = "node", pos = pos }), "main") if level then
if hslot == nil then return end local meta = minetest.get_meta(pos)
local compchance = minetest.get_item_group(itemcomp[hslot]:get_name(), "compostability") local inv = meta:get_inventory()
if compchance == 0 then
hslot = hslot + 1 for i = 1, 5 do
if hslot == 6 then return end local stack = inv:get_stack("main", i)
compchance = minetest.get_item_group(itemcomp[hslot]:get_name(), "compostability") local compchance = minetest.get_item_group(stack:get_name(), "compostability")
if compchance == 0 then
hslot = hslot + 1 if compchance > 0 then
if hslot == 6 then return end stack:take_item()
compchance = minetest.get_item_group(itemcomp[hslot]:get_name(), "compostability") inv:set_stack("main", i, stack)
if compchance == 0 then
hslot = hslot + 1 if compchance >= math.random(0, 100) then
if hslot == 6 then return end mcl_dye.add_bone_meal_particle(vector.offset(downpos, 0, level / 8, 0))
compchance = minetest.get_item_group(itemcomp[hslot]:get_name(), "compostability") if level < 7 then
if compchance == 0 then level = level + 1
hslot = hslot + 1 else
if hslot == 6 then return end level = "ready"
compchance = minetest.get_item_group(itemcomp[hslot]:get_name(), "compostability")
end end
minetest.swap_node(downpos, { name = "mcl_composters:composter_" .. level })
end end
end break
end
if compchance > 0 then
itemcomp[hslot]:take_item()
inv:set_list("main", itemcomp)
local rand = math.random(0, 100)
if compchance >= rand then
local level = 0
if downnode.name == "mcl_composters:composter_1" then
level = 1
elseif downnode.name == "mcl_composters:composter_2" then
level = 2
elseif downnode.name == "mcl_composters:composter_3" then
level = 3
elseif downnode.name == "mcl_composters:composter_4" then
level = 4
elseif downnode.name == "mcl_composters:composter_5" then
level = 5
elseif downnode.name == "mcl_composters:composter_6" then
level = 6
elseif downnode.name == "mcl_composters:composter_7" then
level = 7
end
mcl_dye.add_bone_meal_particle(vector.offset(downpos, 0, level / 8, 0))
if level < 7 then
level = level + 1
else
level = "ready"
end
minetest.swap_node(downpos, { name = "mcl_composters:composter_" .. level })
end end
end end
end end

View File

@ -1,4 +1,4 @@
name = mcl_hoppers name = mcl_hoppers
description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed. description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed.
depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util, mcl_dye
optional_depends = doc, screwdriver optional_depends = doc, screwdriver