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 ch = math.ceil((node_max * i_e - i_max * node_e) / (node_max + i_max)) trans_n = ch trans_i = -ch 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 }) minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) if minetest.get_item_group(itemstack:get_name(), "sparktech_energy_storeonbreak") > 0 then local meta = minetest.get_meta(pos) meta:set_int("energy", itemstack:get_metadata() or 0) end end)