Distribute energy according to node types
This commit is contained in:
parent
93f98146e1
commit
ace37afacf
@ -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,
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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},
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user