summaryrefslogtreecommitdiff
path: root/technic
diff options
context:
space:
mode:
Diffstat (limited to 'technic')
-rw-r--r--technic/machines/HV/battery_box.lua1
-rw-r--r--technic/machines/HV/forcefield.lua77
-rw-r--r--technic/machines/LV/battery_box.lua1
-rw-r--r--technic/machines/register/battery_box.lua101
-rw-r--r--technic/machines/register/cables.lua80
-rw-r--r--technic/machines/supply_converter.lua57
-rw-r--r--technic/machines/switching_station.lua11
7 files changed, 296 insertions, 32 deletions
diff --git a/technic/machines/HV/battery_box.lua b/technic/machines/HV/battery_box.lua
index 9093ba9..89c65da 100644
--- a/technic/machines/HV/battery_box.lua
+++ b/technic/machines/HV/battery_box.lua
@@ -1,4 +1,5 @@
-- HV battery box
+
minetest.register_craft({
output = 'technic:hv_battery_box0',
recipe = {
diff --git a/technic/machines/HV/forcefield.lua b/technic/machines/HV/forcefield.lua
index 3bf93b0..1d46bcf 100644
--- a/technic/machines/HV/forcefield.lua
+++ b/technic/machines/HV/forcefield.lua
@@ -6,6 +6,8 @@
-- How expensive is the generator?
-- Leaves room for upgrades lowering the power drain?
+local digilines_path = minetest.get_modpath("digilines")
+
local forcefield_power_drain = 10
local S = technic.getter
@@ -90,7 +92,14 @@ local function update_forcefield(pos, meta, active, first)
end
local function set_forcefield_formspec(meta)
- local formspec = "size[5,2.25]"..
+ local formspec
+ if digilines_path then
+ formspec = "size[5,3.25]"..
+ "field[0.3,3;5,1;channel;Digiline Channel;"..meta:get_string("channel").."]"
+ else
+ formspec = "size[5,2.25]"
+ end
+ formspec = formspec..
"field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
-- The names for these toggle buttons are explicit about which
-- state they'll switch to, so that multiple presses (arising
@@ -130,9 +139,10 @@ local forcefield_receive_fields = function(pos, formname, fields, sender)
update_forcefield(pos, meta, false)
end
if range then meta:set_int("range", range) end
- if fields.shape0 then meta:set_int("shape", 0) end
- if fields.shape1 then meta:set_int("shape", 1) end
- if fields.enable then meta:set_int("enabled", 1) end
+ if fields.channel then meta:set_string("channel", fields.channel) end
+ if fields.shape0 then meta:set_int("shape", 0) end
+ if fields.shape1 then meta:set_int("shape", 1) end
+ if fields.enable then meta:set_int("enabled", 1) end
if fields.disable then meta:set_int("enabled", 0) end
if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
@@ -150,6 +160,60 @@ local mesecons = {
}
}
+local digiline_def = {
+ receptor = {action = function() end},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local meta = minetest.get_meta(pos)
+ if channel ~= meta:get_string("channel") then
+ return
+ end
+ msg = msg:lower()
+ if msg == "get" then
+ digilines.receptor_send(pos, digilines.rules.default, channel, {
+ enabled = meta:get_int("enabled"),
+ range = meta:get_int("range"),
+ shape = meta:get_int("shape")
+ })
+ return
+ elseif msg == "off" then
+ meta:set_int("enabled", 0)
+ elseif msg == "on" then
+ meta:set_int("enabled", 1)
+ elseif msg == "toggle" then
+ local onn = meta:get_int("enabled")
+ onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0.
+ meta:set_int("enabled", onn)
+ elseif msg:sub(1, 5) == "range" then
+ local range = tonumber(msg:sub(7))
+ if not range then
+ return
+ end
+ range = math.max(range, 5)
+ range = math.min(range, 20)
+ update_forcefield(pos, meta, false)
+ meta:set_int("range", range)
+ elseif msg:sub(1, 5) == "shape" then
+ local shape = msg:sub(7):lower()
+ if shape == "sphere" then
+ shape = 0
+ elseif shape == "cube" then
+ shape = 1
+ end
+ shape = tonumber(shape)
+ if not shape then
+ return
+ end
+ update_forcefield(pos, meta, false)
+ meta:set_int("shape", shape)
+ else
+ return
+ end
+ set_forcefield_formspec(meta)
+ end
+ },
+}
+
local function run(pos, node)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("HV_EU_input")
@@ -205,10 +269,14 @@ minetest.register_node("technic:forcefield_emitter_off", {
meta:set_int("enabled", 0)
meta:set_int("mesecon_mode", 0)
meta:set_int("mesecon_effect", 0)
+ if digilines_path then
+ meta:set_string("channel", "forcefield"..minetest.pos_to_string(pos))
+ end
meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV"))
set_forcefield_formspec(meta)
end,
mesecons = mesecons,
+ digiline = digiline_def,
technic_run = run,
})
@@ -224,6 +292,7 @@ minetest.register_node("technic:forcefield_emitter_on", {
update_forcefield(pos, meta, false)
end,
mesecons = mesecons,
+ digiline = digiline_def,
technic_run = run,
technic_on_disable = function (pos, node)
local meta = minetest.get_meta(pos)
diff --git a/technic/machines/LV/battery_box.lua b/technic/machines/LV/battery_box.lua
index 066bc9d..bf7f846 100644
--- a/technic/machines/LV/battery_box.lua
+++ b/technic/machines/LV/battery_box.lua
@@ -1,3 +1,4 @@
+-- LV Battery box
minetest.register_craft({
output = 'technic:lv_battery_box0',
diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua
index 953f7af..83bedf2 100644
--- a/technic/machines/register/battery_box.lua
+++ b/technic/machines/register/battery_box.lua
@@ -1,4 +1,6 @@
+local digilines_path = minetest.get_modpath("digilines")
+
local S = technic.getter
technic.register_power_tool("technic:battery", 10000)
@@ -62,29 +64,32 @@ function technic.register_battery_box(data)
local ltier = string.lower(tier)
local formspec =
- "invsize[8,9;]"..
+ "size[8,9]"..
"image[1,1;1,2;technic_power_meter_bg.png]"..
- "list[current_name;src;3,1;1,1;]"..
+ "list[context;src;3,1;1,1;]"..
"image[4,1;1,1;technic_battery_reload.png]"..
- "list[current_name;dst;5,1;1,1;]"..
+ "list[context;dst;5,1;1,1;]"..
"label[0,0;"..S("%s Battery Box"):format(tier).."]"..
"label[3,0;"..S("Charge").."]"..
"label[5,0;"..S("Discharge").."]"..
"label[1,3;"..S("Power level").."]"..
"list[current_player;main;0,5;8,4;]"..
- "listring[current_name;dst]"..
+ "listring[context;dst]"..
"listring[current_player;main]"..
- "listring[current_name;src]"..
+ "listring[context;src]"..
"listring[current_player;main]"
+ if digilines_path then
+ formspec = formspec.."button[0.6,3.7;2,1;edit_channel;edit Channel]"
+ end
if data.upgrade then
formspec = formspec..
- "list[current_name;upgrade1;3.5,3;1,1;]"..
- "list[current_name;upgrade2;4.5,3;1,1;]"..
+ "list[context;upgrade1;3.5,3;1,1;]"..
+ "list[context;upgrade2;4.5,3;1,1;]"..
"label[3.5,4;"..S("Upgrade Slots").."]"..
- "listring[current_name;upgrade1]"..
+ "listring[context;upgrade1]"..
"listring[current_player;main]"..
- "listring[current_name;upgrade2]"..
+ "listring[context;upgrade2]"..
"listring[current_player;main]"
end
@@ -98,7 +103,7 @@ function technic.register_battery_box(data)
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
end
local max_charge = data.max_charge * (1 + EU_upgrade / 10)
-
+
-- Charge/discharge the battery with the input EUs
if eu_input >= 0 then
current_charge = math.min(current_charge + eu_input, max_charge)
@@ -113,7 +118,7 @@ function technic.register_battery_box(data)
current_charge, tool_empty = technic.discharge_tools(meta,
current_charge, data.discharge_step,
max_charge)
-
+
if data.tube then
local inv = meta:get_inventory()
technic.handle_machine_pipeworks(pos, tube_upgrade,
@@ -157,27 +162,28 @@ function technic.register_battery_box(data)
end
meta:set_string("infotext", infotext)
end
-
+
for i = 0, 8 do
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
technic_machine=1, ["technic_"..ltier]=1}
if i ~= 0 then
groups.not_in_creative_inventory = 1
end
-
+
if data.tube then
groups.tubedevice = 1
groups.tubedevice_receiver = 1
end
-
+
minetest.register_node("technic:"..ltier.."_battery_box"..i, {
description = S("%s Battery Box"):format(tier),
- tiles = {"technic_"..ltier.."_battery_box_top.png",
- "technic_"..ltier.."_battery_box_bottom.png",
- "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
- "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
- "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
- "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"},
+ tiles = {
+ "technic_"..ltier.."_battery_box_top.png",
+ "technic_"..ltier.."_battery_box_bottom.png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"},
groups = groups,
connect_sides = {"bottom"},
tube = data.tube and tube or nil,
@@ -191,6 +197,7 @@ function technic.register_battery_box(data)
meta:set_string("infotext", S("%s Battery Box"):format(tier))
meta:set_string("formspec", formspec)
+ meta:set_string("channel", ltier.."_battery_box"..minetest.pos_to_string(pos))
meta:set_int(tier.."_EU_demand", 0)
meta:set_int(tier.."_EU_supply", 0)
meta:set_int(tier.."_EU_input", 0)
@@ -206,7 +213,42 @@ function technic.register_battery_box(data)
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
after_place_node = data.tube and pipeworks.after_place,
- after_dig_node = technic.machine_after_dig_node
+ after_dig_node = technic.machine_after_dig_node,
+ on_receive_fields = function(pos, formname, fields, sender)
+ if not fields.edit_channel then
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ minetest.show_formspec(sender:get_player_name(),
+ "technic:battery_box_edit_channel"..minetest.pos_to_string(pos),
+ "field[channel;Digiline Channel;"..meta:get_string("channel").."]")
+ end,
+ digiline = {
+ receptor = {action = function() end},
+ effector = {
+ action = function(pos, node, channel, msg)
+ if msg ~= "GET" and msg ~= "get" then
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if channel ~= meta:get_string("channel") then
+ return
+ end
+ local inv = meta:get_inventory()
+ digilines.receptor_send(pos, digilines.rules.default, channel, {
+ demand = meta:get_int(tier.."_EU_demand"),
+ supply = meta:get_int(tier.."_EU_supply"),
+ input = meta:get_int(tier.."_EU_input"),
+ charge = meta:get_int("internal_EU_charge"),
+ max_charge = data.max_charge * (1 + technic.handle_machine_upgrades(meta) / 10),
+ src = inv:get_stack("src", 1):to_table(),
+ dst = inv:get_stack("dst", 1):to_table(),
+ upgrade1 = inv:get_stack("upgrade1", 1):to_table(),
+ upgrade2 = inv:get_stack("upgrade2", 1):to_table()
+ })
+ end
+ },
+ },
})
end
@@ -218,6 +260,23 @@ function technic.register_battery_box(data)
end -- End registration
+minetest.register_on_player_receive_fields(
+ function(player, formname, fields)
+ if formname:sub(1, 32) ~= "technic:battery_box_edit_channel" or
+ not fields.channel then
+ return
+ end
+ local pos = minetest.string_to_pos(formname:sub(33))
+ local plname = player:get_player_name()
+ if minetest.is_protected(pos, plname) then
+ minetest.record_protection_violation(pos, plname)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ meta:set_string("channel", fields.channel)
+ end
+)
+
function technic.charge_tools(meta, batt_charge, charge_step)
local inv = meta:get_inventory()
diff --git a/technic/machines/register/cables.lua b/technic/machines/register/cables.lua
index 165db98..b0e2e06 100644
--- a/technic/machines/register/cables.lua
+++ b/technic/machines/register/cables.lua
@@ -121,7 +121,8 @@ function technic.register_cable(tier, size)
local ltier = string.lower(tier)
cable_tier["technic:"..ltier.."_cable"] = tier
- local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
+ local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
+ ["technic_"..ltier.."_cable"] = 1}
local node_box = {
type = "connected",
@@ -146,11 +147,86 @@ function technic.register_cable(tier, size)
sunlight_propagates = true,
drawtype = "nodebox",
node_box = node_box,
- connects_to = {"technic:"..ltier.."_cable",
+ connects_to = {"group:technic_"..ltier.."_cable",
"group:technic_"..ltier, "group:technic_all_tiers"},
on_construct = clear_networks,
on_destruct = clear_networks,
})
+
+ local xyz = {
+ ["-x"] = 1,
+ ["-y"] = 2,
+ ["-z"] = 3,
+ ["x"] = 4,
+ ["y"] = 5,
+ ["z"] = 6,
+ }
+ local notconnects = {
+ [1] = "left",
+ [2] = "bottom",
+ [3] = "front",
+ [4] = "right",
+ [5] = "top",
+ [6] = "back",
+ }
+ local function s(p)
+ if p:find("-") then
+ return p:sub(2)
+ else
+ return "-"..p
+ end
+ end
+ for p, i in pairs(xyz) do
+ local def = {
+ description = S("%s Cable Plate"):format(tier),
+ tiles = {"technic_"..ltier.."_cable.png"},
+ groups = table.copy(groups),
+ sounds = default.node_sound_wood_defaults(),
+ drop = "technic:"..ltier.."_cable",
+ paramtype = "light",
+ sunlight_propagates = true,
+ drawtype = "nodebox",
+ node_box = table.copy(node_box),
+ connects_to = {"group:technic_"..ltier.."_cable",
+ "group:technic_"..ltier, "group:technic_all_tiers"},
+ on_construct = clear_networks,
+ on_destruct = clear_networks,
+ }
+ def.node_box.fixed = {
+ {-size, -size, -size, size, size, size},
+ {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}
+ }
+ def.node_box.fixed[1][xyz[p]] = 7/16 * (i-3.5)/math.abs(i-3.5)
+ def.node_box.fixed[2][xyz[s(p)]] = 3/8 * (i-3.5)/math.abs(i-3.5)
+ def.node_box["connect_"..notconnects[i]] = nil
+ if i == 1 then
+ def.on_place = function(itemstack, placer, pointed_thing)
+ local pointed_thing_diff = vector.subtract(pointed_thing.above, pointed_thing.under)
+ local num
+ for k, v in pairs(pointed_thing_diff) do
+ if v ~= 0 then
+ num = xyz[s(tostring(v):sub(-2, -2)..k)]
+ break
+ end
+ end
+ minetest.set_node(pointed_thing.above, {name = "technic:"..ltier.."_cable_plate_"..num})
+ end
+ else
+ def.groups.not_in_creative_inventory = 1
+ end
+ minetest.register_node("technic:"..ltier.."_cable_plate_"..i, def)
+ cable_tier["technic:"..ltier.."_cable_plate_"..i] = tier
+ end
+
+ local c = "technic:"..ltier.."_cable"
+ minetest.register_craft({
+ output = "technic:"..ltier.."_cable_plate_1 5",
+ recipe = {
+ {"", "", c},
+ {c , c , c},
+ {"", "", c},
+ }
+ })
end
diff --git a/technic/machines/supply_converter.lua b/technic/machines/supply_converter.lua
index af10baa..8ae4dd4 100644
--- a/technic/machines/supply_converter.lua
+++ b/technic/machines/supply_converter.lua
@@ -7,11 +7,17 @@
-- Once the receiver side is powered it will deliver power to the other side.
-- Unused power is wasted just like any other producer!
+local digilines_path = minetest.get_modpath("digilines")
+
local S = technic.getter
local function set_supply_converter_formspec(meta)
local formspec = "size[5,2.25]"..
"field[0.3,0.5;2,1;power;"..S("Input Power")..";"..meta:get_int("power").."]"
+ if digilines_path then
+ formspec = formspec..
+ "field[2.3,0.5;3,1;channel;Digiline Channel;"..meta:get_string("channel").."]"
+ end
-- The names for these toggle buttons are explicit about which
-- state they'll switch to, so that multiple presses (arising
-- from the ambiguity between lag and a missed press) only make
@@ -34,13 +40,14 @@ local supply_converter_receive_fields = function(pos, formname, fields, sender)
local power = nil
if fields.power then
power = tonumber(fields.power) or 0
- power = 100 * math.floor(power / 100)
power = math.max(power, 0)
power = math.min(power, 10000)
+ power = 100 * math.floor(power / 100)
if power == meta:get_int("power") then power = nil end
end
if power then meta:set_int("power", power) end
- if fields.enable then meta:set_int("enabled", 1) end
+ if fields.channel then meta:set_string("channel", fields.channel) end
+ if fields.enable then meta:set_int("enabled", 1) end
if fields.disable then meta:set_int("enabled", 0) end
if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
@@ -58,6 +65,48 @@ local mesecons = {
}
}
+
+local digiline_def = {
+ receptor = {action = function() end},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local meta = minetest.get_meta(pos)
+ if channel ~= meta:get_string("channel") then
+ return
+ end
+ msg = msg:lower()
+ if msg == "get" then
+ digilines.receptor_send(pos, digilines.rules.default, channel, {
+ enabled = meta:get_int("enabled"),
+ power = meta:get_int("power"),
+ mesecon_mode = meta:get_int("mesecon_mode")
+ })
+ return
+ elseif msg == "off" then
+ meta:set_int("enabled", 0)
+ elseif msg == "on" then
+ meta:set_int("enabled", 1)
+ elseif msg == "toggle" then
+ local onn = meta:get_int("enabled")
+ onn = -(onn-1) -- Mirror onn with pivot 0.5, so switch between 1 and 0.
+ meta:set_int("enabled", onn)
+ elseif msg:sub(1, 5) == "power" then
+ local power = tonumber(msg:sub(7))
+ if not power then
+ return
+ end
+ power = math.max(power, 0)
+ power = math.min(power, 10000)
+ power = 100 * math.floor(power / 100)
+ meta:set_int("power", power)
+ elseif msg:sub(1, 12) == "mesecon_mode" then
+ meta:set_int("mesecon_mode", tonumber(msg:sub(14)))
+ end
+ set_supply_converter_formspec(meta)
+ end
+ },
+}
+
local run = function(pos, node, run_stage)
-- run only in producer stage.
if run_stage == technic.receiver then
@@ -120,6 +169,9 @@ minetest.register_node("technic:supply_converter", {
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Supply Converter"))
+ if digilines_path then
+ meta:set_string("channel", "supply_converter"..minetest.pos_to_string(pos))
+ end
meta:set_int("power", 10000)
meta:set_int("enabled", 1)
meta:set_int("mesecon_mode", 0)
@@ -127,6 +179,7 @@ minetest.register_node("technic:supply_converter", {
set_supply_converter_formspec(meta)
end,
mesecons = mesecons,
+ digiline = digiline_def,
technic_run = run,
technic_on_disable = run,
})
diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua
index 4fbd269..be5f6c0 100644
--- a/technic/machines/switching_station.lua
+++ b/technic/machines/switching_station.lua
@@ -48,6 +48,13 @@ minetest.register_craft({
}
})
+local mesecon_def
+if mesecons_path then
+ mesecon_def = {effector = {
+ rules = mesecon.rules.default,
+ }}
+end
+
minetest.register_node("technic:switching_station",{
description = S("Switching Station"),
tiles = {"technic_water_mill_top_active.png", "technic_water_mill_top_active.png",
@@ -80,9 +87,7 @@ minetest.register_node("technic:switching_station",{
local meta = minetest.get_meta(pos)
meta:set_string("channel", fields.channel)
end,
- mesecons = {effector = {
- rules = mesecon.rules.default,
- }},
+ mesecons = mesecon_def,
digiline = {
receptor = {action = function() end},
effector = {