Distribute energy according to node types

This commit is contained in:
Valentin Anger 2017-08-30 14:42:26 +02:00
parent 93f98146e1
commit ace37afacf
6 changed files with 90 additions and 11 deletions

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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},

View File

@ -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
},

View File

@ -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
}