From ace37afacffc8818c9d2ff3ac258ee2bd3d50564 Mon Sep 17 00:00:00 2001 From: Valentin Anger Date: Wed, 30 Aug 2017 14:42:26 +0200 Subject: [PATCH] Distribute energy according to node types --- sparkcore/capacitor.lua | 2 +- sparkcore/energy_distrib.lua | 94 ++++++++++++++++++++++++++--- sparkdebug/energynodes.lua | 2 + sparkfurnace/metalfurnace.lua | 1 + sparkgenerators/burnergenerator.lua | 1 + sparkgenerators/solar.lua | 1 + 6 files changed, 90 insertions(+), 11 deletions(-) diff --git a/sparkcore/capacitor.lua b/sparkcore/capacitor.lua index 34054d3..379dabe 100644 --- a/sparkcore/capacitor.lua +++ b/sparkcore/capacitor.lua @@ -10,7 +10,7 @@ minetest.register_node(minetest.get_current_modname() ..":capacitor", { }, groups = { sparktech_techy = 3, - sparktech_energy_conductor = 3, + sparktech_energy_type = 3, sparktech_energy_storeonbreak = 1, sparktech_energy_max = 40000, sparktech_net_trigger = 1, diff --git a/sparkcore/energy_distrib.lua b/sparkcore/energy_distrib.lua index 92492e5..83238f7 100644 --- a/sparkcore/energy_distrib.lua +++ b/sparkcore/energy_distrib.lua @@ -25,26 +25,100 @@ local function net_get_slaves(master) return slaves end -local function net_distribute(pos) +local function net_distribute(pos) + -- sparktech_energy_type types: + -- 2 - Producer (gets emptied) + -- 3 - Storage (backup / overflow) + -- 4 - Consumer (gets filled) + local nodes = net_get_slaves(pos) nodes[#nodes +1] = pos -- all nodes are in local now - local energy = 0 + + -- Gather all information we need for the three node types + local energy_pr = 0 + local energy_st = 0 + local energy_co = 0 + local max_energy_pr = 0 + local max_energy_st = 0 + local max_energy_co = 0 for x = 1, #nodes do - energy = energy + minetest.get_meta(nodes[x]):get_int("energy") - end - local max_energy = 0 - for x = 1, #nodes do - max_energy = max_energy + minetest.get_item_group(minetest.get_node(nodes[x]).name, "sparktech_energy_max") + local ntype = minetest.get_item_group(minetest.get_node(nodes[x]).name, "sparktech_energy_type") + local nenergy = minetest.get_meta(nodes[x]):get_int("energy") + local nenergy_max = minetest.get_item_group(minetest.get_node(nodes[x]).name, "sparktech_energy_max") + if ntype == 2 then + energy_pr = energy_pr + nenergy + max_energy_pr = max_energy_pr + nenergy_max + elseif ntype == 3 then + energy_st = energy_st + nenergy + max_energy_st = max_energy_st + nenergy_max + elseif ntype == 4 then + energy_co = energy_co + nenergy + max_energy_co = max_energy_co + nenergy_max + end end -- now we know all energy in the system, now to distribute it - - local share = energy / max_energy; + + local pr_new = energy_pr + local st_new = energy_st + local co_new = energy_co + + -- How much energy is available to be put into storage / is missing to fill up the consumers + local prod_buf = energy_pr - (max_energy_co - energy_co) + + -- Producers -> Consumers transfer + if prod_buf >= 0 then + -- Fill up the consumers to their limit + pr_new = prod_buf + co_new = co_new + (energy_pr - prod_buf) + else + -- Empty the producers into the consumers + pr_new = 0 + co_new = co_new + energy_pr + end + + -- Storage -> Consumers and Producers -> Storage transfers + if prod_buf < 0 then + -- Fill up the consumers with energy in storage + local sto_buf = energy_st + prod_buf + if sto_buf >= 0 then + st_new = sto_buf + co_new = co_new + energy_st - sto_buf + else + st_new = 0 + co_new = co_new + energy_st + end + else + -- Store excess energy into storage + local st_cap = max_energy_st - energy_st + if st_cap >= prod_buf then + pr_new = 0 + st_new = st_new + prod_buf + else + pr_new = prod_buf - st_cap + st_new = st_new + st_cap + end + end + + -- Now the new energy distribution is known + + -- Apply the later to be improved (maybe) share system to all node types + local share_pr = pr_new / max_energy_pr; + local share_st = st_new / max_energy_st; + local share_co = co_new / max_energy_co; for x = 1, #nodes do local meta = minetest.get_meta(nodes[x]) local node = minetest.get_node(nodes[x]) - meta:set_int("energy", round(share * minetest.get_item_group(node.name, "sparktech_energy_max"))) + local ntype = minetest.get_item_group(node.name, "sparktech_energy_type") + local nmax = minetest.get_item_group(node.name, "sparktech_energy_max") + if ntype == 2 then + meta:set_int("energy", round(share_pr * nmax)) + elseif ntype == 3 then + meta:set_int("energy", round(share_st * nmax)) + elseif ntype == 4 then + meta:set_int("energy", round(share_co * nmax)) + end end end diff --git a/sparkdebug/energynodes.lua b/sparkdebug/energynodes.lua index 60d9636..286821f 100644 --- a/sparkdebug/energynodes.lua +++ b/sparkdebug/energynodes.lua @@ -10,6 +10,7 @@ minetest.register_node("sparkdebug:energyvoid", { }, groups = { sparkdebug = 1, + sparktech_energy_type = 4, sparktech_net_trigger = 1, sparktech_energy_max = 10000, sparktech_techy = 1 @@ -28,6 +29,7 @@ minetest.register_node("sparkdebug:energysource", { }, groups = { sparkdebug = 1, + sparktech_energy_type = 2, sparktech_net_trigger = 1, sparktech_energy_max = 10000, sparktech_techy = 1 diff --git a/sparkfurnace/metalfurnace.lua b/sparkfurnace/metalfurnace.lua index 6d00212..8c2f6ba 100644 --- a/sparkfurnace/metalfurnace.lua +++ b/sparkfurnace/metalfurnace.lua @@ -68,6 +68,7 @@ minetest.register_node(minetest.get_current_modname() .. ":lv_furnace", { }, paramtype2 = "facedir", groups = { sparktech_techy = 1, + sparktech_energy_type = 4, sparktech_net_trigger = 1, sparktech_energy_max = 300, spark_energy_timer = 2}, diff --git a/sparkgenerators/burnergenerator.lua b/sparkgenerators/burnergenerator.lua index 037c278..ce8ea84 100644 --- a/sparkgenerators/burnergenerator.lua +++ b/sparkgenerators/burnergenerator.lua @@ -20,6 +20,7 @@ minetest.register_node(minetest.get_current_modname() .. ":burnergenerator", { paramtype2 = "facedir", groups = { sparktech_techy = 1, + sparktech_energy_type = 2, sparktech_net_trigger = 1, sparktech_energy_max = 10000 }, diff --git a/sparkgenerators/solar.lua b/sparkgenerators/solar.lua index b4cc4f8..d7119d7 100644 --- a/sparkgenerators/solar.lua +++ b/sparkgenerators/solar.lua @@ -14,6 +14,7 @@ minetest.register_node(minetest.get_current_modname() .. ":solar", { }, groups = { sparktech_techy = 1, + sparktech_energy_type = 2, sparktech_net_trigger = 1, sparktech_energy_max = 50 }