pyutest-cd2025/mods/pyutest_core/electricity.lua
2024-06-18 13:25:02 -06:00

132 lines
3.4 KiB
Lua

PyuTestCore.ELECTRICITY_UPDATE_TIME = 0.1
local function set_powered(pos, value)
local meta = minetest.get_meta(pos)
if value then
meta:set_int("powered", 1)
else
meta:set_int("powered", 0)
end
end
local function get_powered(pos)
local meta = minetest.get_meta(pos)
return meta:get_int("powered") == 1 and true or false
end
local function is_electrified(pos)
local positions = {
vector.new(pos.x + 1, pos.y, pos.z),
vector.new(pos.x - 1, pos.y, pos.z),
vector.new(pos.x, pos.y + 1, pos.z),
vector.new(pos.x, pos.y - 1, pos.z),
vector.new(pos.x, pos.y, pos.z + 1),
vector.new(pos.x, pos.y, pos.z - 1)
}
local result = false
for _, v in pairs(positions) do
if get_powered(v) then
result = true
break
end
end
return result
end
PyuTestCore.make_ore("copper", "Copper", "ingot", "Ingot", "ore-copper.png", "ingot.png", "goldenrod", 21, 9, 3, PyuTestCore.BLOCK_BREAKABLE_LONG, nil, {
on_construct = function (pos)
set_powered(pos, true)
end
})
PyuTestCore.make_node("pyutest_core:copper_wire", "copper_wire", "Copper Wire", {
block = PyuTestCore.BLOCK_BREAKABLE_INSTANT
}, {"wire.png"}, {
drawtype = "signlike",
paramtype = "light",
sunlight_propagates = true,
color = "goldenrod",
walkable = false,
inventory_image = "wire.png",
paramtype2 = "wallmounted",
selection_box = {
type = "wallmounted"
},
on_construct = function (pos)
set_powered(pos, false)
local timer = minetest.get_node_timer(pos)
timer:start(PyuTestCore.ELECTRICITY_UPDATE_TIME)
end,
on_timer = function (pos)
if is_electrified(pos) then
set_powered(pos, true)
else
set_powered(pos, false)
end
local timer = minetest.get_node_timer(pos)
timer:start(PyuTestCore.ELECTRICITY_UPDATE_TIME)
end
})
minetest.register_craft({
output = "pyutest_core:copper_wire 16",
recipe = {
"pyutest_core:copper_ingot"
},
type = "shapeless"
})
PyuTestCore.make_device = function (ns, sname, desc, color, action, setup, extra_conf)
PyuTestCore.make_node(ns..":"..sname.."_device", sname.."_device", desc, {
block = PyuTestCore.BLOCK_BREAKABLE_NORMAL
}, {"device.png"}, PyuTestCore.util.tableconcat({
color = color,
on_construct = function (pos)
local s = setup or function (_) end
s(pos)
local timer = minetest.get_node_timer(pos)
timer:start(PyuTestCore.ELECTRICITY_UPDATE_TIME)
end,
on_timer = function (pos)
if is_electrified(pos) then
action(true, pos)
else
action(false, pos)
end
local timer = minetest.get_node_timer(pos)
timer:start(PyuTestCore.ELECTRICITY_UPDATE_TIME)
end
}, extra_conf or {}))
end
PyuTestCore.make_device("pyutest_core", "time", "Time Device", "orange", function (e)
if not e then return end
minetest.chat_send_all(string.format("Time: " .. os.date("%I:%M:%S", os.time())))
end)
PyuTestCore.make_device("pyutest_core", "block_setter", "Block Setter Device", "blue", function (e, pos)
if not e then return end
local blocks = {}
for k, _ in pairs(minetest.registered_nodes) do
local no_disallowed_blocks_match = (k ~= "ignore" and k ~= "pyutest_core:contagious_acid")
if no_disallowed_blocks_match then
table.insert(blocks, k)
end
end
local pos = vector.new(pos.x, pos.y + 1, pos.z)
minetest.remove_node(pos)
minetest.place_node(pos, {name = blocks[math.random(#blocks)]})
end)
--PyuTestCore.make_device("pyutest_core", "")