diff options
Diffstat (limited to 'technic')
-rw-r--r-- | technic/machines/HV/battery_box.lua | 1 | ||||
-rw-r--r-- | technic/machines/HV/forcefield.lua | 77 | ||||
-rw-r--r-- | technic/machines/LV/battery_box.lua | 1 | ||||
-rw-r--r-- | technic/machines/register/battery_box.lua | 101 | ||||
-rw-r--r-- | technic/machines/register/cables.lua | 80 | ||||
-rw-r--r-- | technic/machines/supply_converter.lua | 57 | ||||
-rw-r--r-- | technic/machines/switching_station.lua | 11 |
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 = { |