2017-01-04 16:44:55 +01:00

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