127 lines
4.3 KiB
Lua
127 lines
4.3 KiB
Lua
local function validate(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
if meta:get_string("sparktech_energy_trig") == "" then
|
|
meta:set_string("sparktech_energy_trig", "yyxxzz")
|
|
end
|
|
end
|
|
|
|
local function execution_check(pos, fromdir)
|
|
local ret = false
|
|
if minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_conductor") > 0 then
|
|
validate(pos)
|
|
local nodemeta = minetest.get_meta(pos)
|
|
local dir = 0
|
|
if fromdir % 2 == 0 then
|
|
dir = fromdir - 1
|
|
else
|
|
dir = fromdir + 1
|
|
end
|
|
|
|
local string = nodemeta:get_string("sparktech_energy_trig")
|
|
local letter = string:sub(dir, dir)
|
|
if letter:byte() >= 97 and letter:byte() <= 122 then
|
|
nodemeta:set_string("sparktech_energy_trig", "" .. string:sub(1, dir - 1) .. letter:upper() .. string:sub(dir + 1, 6))
|
|
ret = true
|
|
else
|
|
nodemeta:set_string("sparktech_energy_trig", "" .. string:sub(1, dir - 1) .. letter:lower() .. string:sub(dir + 1, 6))
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
local function energy_logic(node, pos)
|
|
local node_m = minetest.get_meta(pos)
|
|
local node_con = minetest.get_item_group(node.name, "sparktech_energy_conductor")
|
|
local node_in = minetest.get_item_group(node.name, "sparktech_energy_in")
|
|
local node_out = minetest.get_item_group(node.name, "sparktech_energy_out")
|
|
local node_max = minetest.get_item_group(node.name, "sparktech_energy_max")
|
|
|
|
local top = {x = pos.x, y = pos.y + 1, z = pos.z}
|
|
local bottom = {x = pos.x, y = pos.y - 1, z = pos.z}
|
|
local left = {x = pos.x - 1, y = pos.y, z = pos.z}
|
|
local right = {x = pos.x + 1, y = pos.y, z = pos.z}
|
|
local front = {x = pos.x, y = pos.y, z = pos.z - 1}
|
|
local back = {x = pos.x, y = pos.y, z = pos.z + 1}
|
|
|
|
local dir = {top, bottom, left, right, front, back}
|
|
local edir = {}
|
|
|
|
for k = 1, 6 do
|
|
if execution_check(dir[k], k) then
|
|
edir[#edir + 1] = dir[k]
|
|
local string = node_m:get_string("sparktech_energy_trig")
|
|
node_m:set_string("sparktech_energy_trig", "" .. string:sub(1, k - 1) .. string:sub(k, k):upper() .. string:sub(k + 1, 6))
|
|
else
|
|
local string = node_m:get_string("sparktech_energy_trig")
|
|
node_m:set_string("sparktech_energy_trig", "" .. string:sub(1, k - 1) .. string:sub(k, k):lower() .. string:sub(k + 1, 6))
|
|
end
|
|
end
|
|
|
|
for _, k in pairs(edir) do
|
|
local node_e = node_m:get_int("energy")
|
|
local i = minetest.get_node(k)
|
|
local i_m = minetest.get_meta(k)
|
|
local i_e = i_m:get_int("energy")
|
|
local i_con = minetest.get_item_group(i.name, "sparktech_energy_conductor")
|
|
local i_in = minetest.get_item_group(i.name, "sparktech_energy_in")
|
|
local i_out = minetest.get_item_group(i.name, "sparktech_energy_out")
|
|
local i_max = minetest.get_item_group(i.name, "sparktech_energy_max")
|
|
local node_r = node_e / node_max
|
|
local i_r = i_e / i_max
|
|
local trans_n = 0
|
|
local trans_i = 0
|
|
|
|
if node_con == 2 and i_con ~= 2 then
|
|
trans_n = - node_e
|
|
trans_i = node_e
|
|
elseif i_con == 2 and node_con ~= 2 then
|
|
trans_n = i_e
|
|
trans_i = - i_e
|
|
elseif i_con == 4 and node_con ~= 4 then
|
|
trans_n = - node_e
|
|
trans_i = node_e
|
|
elseif node_con == 4 and i_con ~= 4 then
|
|
trans_n = i_e
|
|
trans_i = - i_e
|
|
elseif node_con ~= 4 and i_con ~= 4 then
|
|
local middle = (i_r + node_r) / 2
|
|
local node_g = math.ceil(node_max * middle)
|
|
local i_g = math.ceil(i_max * middle)
|
|
local delta_n = node_g - node_e
|
|
local delta_i = i_g - i_e
|
|
if math.abs(delta_n) < math.abs(delta_i) then
|
|
trans_n = delta_n
|
|
trans_i = - delta_n
|
|
else
|
|
trans_n = - delta_i
|
|
trans_i = delta_i
|
|
end
|
|
end
|
|
|
|
if trans_n + node_e > node_max then
|
|
local ch = trans_n - (node_max - node_e)
|
|
trans_n = trans_n - ch
|
|
trans_i = trans_i + ch
|
|
end
|
|
if trans_i + i_e > i_max then
|
|
local ch = trans_i - (i_max - i_e)
|
|
trans_n = trans_n + ch
|
|
trans_i = trans_i - ch
|
|
end
|
|
|
|
i_m:set_int("energy", i_m:get_int("energy") + trans_i)
|
|
node_m:set_int("energy", node_m:get_int("energy") + trans_n)
|
|
end
|
|
end
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"group:sparktech_energy_conductor"},
|
|
interval = 1.0,
|
|
chance = 1,
|
|
catch_up = true,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
validate(pos)
|
|
energy_logic(node, pos)
|
|
end
|
|
})
|