mods that hopefully work for a TechAge-based pack

This commit is contained in:
tangent committed 2026-09-09 06:27:51 -06:00
1 parent 4e6b08d194
commit c27db2a537
6234 files changed
+375578

No files matched your search

@@ -0,0 +1,194 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA2 Drive Axles for the Steam Engine
]]--
-- for lazy programmers
local P = minetest.string_to_pos
local M = minetest.get_meta
local S = techage.S
local power = networks.power
local Axle = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6},
max_tube_length = 10,
show_infotext = false,
tube_type = "axle",
primary_node_names = {"techage:axle", "techage:axle_on", "techage:ta2_clutch_on"},
secondary_node_names = {},
after_place_tube = function(pos, param2, tube_type, num_tubes, state)
local node = minetest.get_node(pos)
local name = node.name
if name == "techage:axle_on" or name == "techage:axle" then
if state == "on" then -- texture state
minetest.swap_node(pos, {name = "techage:axle_on", param2 = param2})
else
minetest.swap_node(pos, {name = "techage:axle", param2 = param2})
end
else
minetest.swap_node(pos, {name = name, param2 = param2})
end
end,
})
-- Use global callback instead of node related functions
Axle:register_on_tube_update2(function(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2, node)
end)
minetest.register_node("techage:axle", {
description = S("TA2 Drive Axle"),
tiles = {
"techage_axleR.png",
"techage_axleR.png",
"techage_axle.png",
"techage_axle.png",
"techage_axle_clutch.png",
"techage_axle_clutch.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Axle:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Axle:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-3/16, -3/16, -4/8, 3/16, 3/16, 4/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {crumbly = 3, cracky = 3, snappy = 3},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:axle_on", {
description = S("TA2 Drive Axle"),
tiles = {
{
name = "techage_axle4R.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
{
name = "techage_axle4R.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
{
name = "techage_axle4.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
{
name = "techage_axle4.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
{
name = "techage_axle_clutch4.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
{
name = "techage_axle_clutch4.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Axle:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Axle:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-3/16, -3/16, -4/8, 3/16, 3/16, 4/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
diggable = false,
groups = {not_in_creative_inventory = 1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_craft({
output = "techage:axle 3",
recipe = {
{"default:junglewood", "", "default:wood"},
{"", "techage:iron_ingot", ""},
{"default:wood", "", "default:junglewood"},
},
})
techage.Axle = Axle
@@ -0,0 +1,193 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Electric Cables (AC)
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local power = networks.power
local ELE1_MAX_CABLE_LENGHT = 1000
local Cable = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6},
max_tube_length = ELE1_MAX_CABLE_LENGHT,
show_infotext = false,
tube_type = "ele1",
primary_node_names = {"techage:electric_cableS", "techage:electric_cableA",
"techage:power_line", "techage:power_lineS", "techage:power_lineA",
"techage:power_pole2", "techage:powerswitch_box", "techage:powerswitch_box_on"},
secondary_node_names = {},
after_place_tube = function(pos, param2, tube_type, num_tubes)
local node = minetest.get_node(pos)
local name = node.name
local color_param2 = math.floor(node.param2 / 32) * 32
if name == "techage:powerswitch_box" or name == "techage:powerswitch_box_on" or name == "techage:powerswitch_box_off" then
minetest.swap_node(pos, {name = name, param2 = param2 % 32})
elseif name == "techage:power_line" or name == "techage:power_lineS" or name == "techage:power_lineA" then
minetest.swap_node(pos, {name = "techage:power_line"..tube_type, param2 = param2 % 32})
elseif name == "techage:power_pole2" then
-- nothing
elseif not networks.hidden_name(pos) then
minetest.swap_node(pos, {name = "techage:electric_cable"..tube_type, param2 = param2 % 32 + color_param2})
end
M(pos):set_int("netw_param2", param2)
M(pos):set_int("netw_color_param2", color_param2)
end,
})
-- Enable hidden cables
networks.use_metadata(Cable)
networks.register_hidden_message("Use the trowel tool to remove the node.")
-- Use global callback instead of node related functions
Cable:register_on_tube_update2(function(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2, node)
end)
local preserve_metadata = function(pos, oldnode, oldmeta, drops)
for _,drop in ipairs(drops) do
local meta = drop:get_meta()
if meta:get_int("palette_index") == 0 then
meta:set_string("palette_index", "")
end
end
end
minetest.register_node("techage:electric_cableS", {
description = S("TA Electric Cable"),
tiles = {
-- up, down, right, left, back, front
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
},
overlay_tiles = {
"",
"",
"",
"",
{ name = "techage_electric_cable_end.png", color = "white" },
{ name = "techage_electric_cable_end.png", color = "white" },
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "colorfacedir", -- important!
palette = "techage_cable_palette.png",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-3/32, -3/32, -4/8, 3/32, 3/32, 4/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1},
sounds = default.node_sound_defaults(),
preserve_metadata = preserve_metadata,
})
minetest.register_node("techage:electric_cableA", {
description = S("TA Electric Cable"),
tiles = {
-- up, down, right, left, back, front
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
"techage_electric_cable.png",
},
overlay_tiles = {
"",
{ name = "techage_electric_cable_end.png", color = "white" },
"",
"",
"",
{ name = "techage_electric_cable_end.png", color = "white" },
},
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "colorfacedir", -- important!
palette = "techage_cable_palette.png",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-3/32, -4/8, -3/32, 3/32, 3/32, 3/32},
{-3/32, -3/32, -4/8, 3/32, 3/32, -3/32},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3,
techage_trowel = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
drop = {
items = {
{ items = { "techage:electric_cableS" }, inherit_color = true },
}
},
preserve_metadata = preserve_metadata,
})
minetest.register_craft({
output = "techage:electric_cableS 6",
recipe = {
{"basic_materials:plastic_sheet", "", ""},
{"", "default:copper_ingot", ""},
{"", "", "basic_materials:plastic_sheet"},
},
})
techage.ElectricCable = Cable
techage.ELE1_MAX_CABLE_LENGTH = ELE1_MAX_CABLE_LENGHT
for idx, color in ipairs({ "white", "grey", "black", "brown", "yellow", "red", "dark_green", "blue" }) do
minetest.register_craft({
output = idx == 1 and "techage:electric_cableS 8" or minetest.itemstring_with_palette("techage:electric_cableS 8", (idx-1)*32),
recipe = {
{ "techage:electric_cableS", "techage:electric_cableS", "techage:electric_cableS", },
{ "techage:electric_cableS", "dye:"..color, "techage:electric_cableS", },
{ "techage:electric_cableS", "techage:electric_cableS", "techage:electric_cableS", },
}
})
end
@@ -0,0 +1,321 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
Power Formspec Functions
]]--
--local P2S = minetest.pos_to_string
--local M = minetest.get_meta
--local N = function(pos) return minetest.get_node(pos).name end
local S = techage.S
local CYCLE_TIME = 2
local CYCLES_PER_DAY = 20 * 60 / CYCLE_TIME
local in_range = techage.in_range
local power = networks.power
techage.power = {}
-------------------------------------------------------------------------------
-- Helper function
-------------------------------------------------------------------------------
local function round(val)
val = tonumber(val) or 0
if val > 100 then
return math.floor(val + 0.5)
elseif val > 10 then
return math.floor((val * 10) + 0.5) / 10
else
return math.floor((val * 100) + 0.5) / 100
end
end
local function calc_percent(max_val, curr_val)
return round(math.min(((curr_val or 0) * 100) / (max_val or 1.0), 100))
end
-------------------------------------------------------------------------------
-- Local bar functions
-------------------------------------------------------------------------------
-- charging > 0 ==> charging
-- charging < 0 ==> uncharging
-- charging = 0 ==> off
-- percent: 0..100
local function charging_bar(charging, percent)
if charging > 0 then
return "techage_form_level_off.png^[lowpart:" .. percent .. ":techage_form_level_charge.png"
elseif charging < 0 then
return "techage_form_level_unload.png^[lowpart:" .. percent .. ":techage_form_level_off.png"
else
return "techage_form_level_off.png"
end
end
local function power_bar(current_power, max_power)
local percent, ypos
current_power = current_power or 0
if current_power == 0 then
percent = 0
ypos = 2.8
else
percent = calc_percent(max_power, current_power)
-- 0.4 to 2.8 = 2.4
local offs = 2.4 - (current_power / max_power) * 2.4
ypos = 0.4 + in_range(offs, 0.4, 2.4)
end
current_power = round(current_power)
max_power = round(max_power)
percent = (percent + 5) / 1.1 -- texture correction
return "label[0.7,0.4;" .. max_power .. " ku]" ..
"image[0,0.5;1,3;" ..
"techage_form_level_bg.png^[lowpart:" .. percent ..
":techage_form_level_fg.png]" ..
"label[0.7," .. ypos .. ";" .. current_power .. " ku]"
end
local function storage_bar(current_power, max_power)
local percent, ypos
max_power = (max_power or 1) / CYCLES_PER_DAY
current_power = (current_power or 0) / CYCLES_PER_DAY
if current_power == 0 then
percent = 0
ypos = 2.8
else
percent = calc_percent(max_power, current_power)
-- 0.4 to 2.8 = 2.4
local offs = 2.4 - (current_power / max_power) * 2.4
ypos = 0.4 + in_range(offs, 0.4, 2.4)
end
current_power = round(current_power)
max_power = round(max_power)
local percent2 = (percent + 5) / 1.1 -- texture correction
return "label[0.7,0.4;" .. max_power .. " kud]" ..
"image[0,0.5;1,3;"..
"techage_form_level_bg.png^[lowpart:" .. percent2 ..
":techage_form_level_fg.png]" ..
"label[0.7," .. ypos .. ";" .. round(percent) .. " %]"
end
-------------------------------------------------------------------------------
-- API bar functions
-------------------------------------------------------------------------------
function techage.formspec_power_bar(pos, x, y, label, current_power, max_power)
return "container["..x..","..y.."]"..
"box[0,0;2.3,3.3;#395c74]"..
"label[0.2,0;"..label.."]"..
power_bar(current_power, max_power)..
"container_end[]"
end
function techage.formspec_charging_bar(pos, x, y, label, data)
local charging = 0
local percent = 50
local ypos = 1.6
if data then
charging = data.provided - data.consumed
if charging > 0 then
percent = 50 + (charging / data.available * 50)
ypos = 1.6 - (charging / data.available * 1.2)
elseif charging < 0 then
percent = 50 + (charging / data.consumed * 50)
ypos = 1.6 - (charging / data.consumed * 1.2)
end
end
ypos = in_range(ypos, 0.4, 2.8)
return "container[".. x .. "," .. y .. "]" ..
"box[0,0;2.3,3.3;#395c74]" ..
"label[0.2,0;" .. label .. "]" ..
"image[0,0.5;1,3;" .. charging_bar(charging, percent) .. "]" ..
"label[0.75," .. ypos .. ";" .. round(charging) .. " ku]" ..
"container_end[]"
end
function techage.formspec_storage_bar(pos, x, y, label, curr_load, max_load)
curr_load = curr_load or 0
return "container[" .. x .. "," .. y .. "]" ..
"box[0,0;2.3,3.3;#395c74]" ..
"label[0.2,0;" .. label .. "]" ..
storage_bar(curr_load, max_load) ..
"container_end[]"
end
function techage.formspec_meter(pos, x, y, label, value, unit)
return "container[" .. x .. "," .. y .. "]" ..
"box[0,0;2.3,0.9;#395c74]" ..
"label[0.2,0.0;" .. label .. ":]" ..
"label[0.2,0.4;" .. round(value) .. " " .. unit .. "]" ..
"container_end[]"
end
-------------------------------------------------------------------------------
-- API formspec functions
-------------------------------------------------------------------------------
function techage.wrench_image(x, y)
return "image["..x.."," .. y .. ";0.5,0.5;techage_inv_wrench.png]" ..
"tooltip["..x.."," .. y .. ";0.5,0.5;" .. S("Block has a wrench menu") .. ";#0C3D32;#FFFFFF]"
end
function techage.storage_formspec(self, pos, nvm, label, netw_data, curr_load, max_load)
return "size[6.3,4]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"box[0,-0.1;6.1,0.5;#c6e8ff]" ..
"label[0.2,-0.1;" .. minetest.colorize( "#000000", label) .. "]" ..
techage.formspec_charging_bar(pos, 0.0, 0.8, S("Charging"), netw_data) ..
techage.formspec_storage_bar (pos, 3.8, 0.8, S("Storage"), curr_load, max_load) ..
"image_button[2.7,2;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" ..
"tooltip[2.7,2;1,1;" .. self:get_state_tooltip(nvm) .. "]"
end
function techage.generator_formspec(self, pos, nvm, label, provided, max_available, ta2)
local tooltip = ""
if not ta2 then
tooltip = techage.wrench_tooltip(4.4, -0.05)
end
return "size[5,4]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"box[0,-0.1;4.8,0.5;#c6e8ff]" ..
"label[0.2,-0.1;" .. minetest.colorize( "#000000", label) .. "]" ..
tooltip..
techage.formspec_power_bar(pos, 0, 0.8, S("Power"), provided, max_available) ..
"image_button[3.2,2.0;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" ..
"tooltip[3.2,2.0;1,1;" .. self:get_state_tooltip(nvm) .. "]"
end
function techage.generator_settings(tier, available)
if tier == "ta3" then
return {
{
type = "const",
name = "available",
label = S("Maximum output [ku]"),
tooltip = S("The maximum power the generator can provide"),
value = available,
},
{
type = "output",
name = "provided",
label = S("Current output [ku]"),
tooltip = S("The current power the generator provides"),
},
{
type = "dropdown",
choices = "0% - 20%,20% - 40%,40% - 60%,60% - 80%,80% - 100%,90% - 100%",
name = "termpoint",
label = S("Charge termination"),
tooltip = S("Range in which the generator reduces its power"),
default = "80% - 100%",
},
}
else
return {
{
type = "const",
name = "available",
label = S("Maximum output [ku]"),
tooltip = S("The maximum power the generator can provide"),
value = available,
},
{
type = "output",
name = "provided",
label = S("Current output [ku]"),
tooltip = S("The current power the generator provides"),
},
{
type = "dropdown",
choices = "0% - 20%,20% - 40%,40% - 60%,60% - 80%,80% - 100%,90% - 100%",
name = "termpoint",
label = S("Charge termination"),
tooltip = S("Range in which the generator reduces its power"),
default = "80% - 100%",
},
}
end
end
function techage.evaluate_charge_termination(nvm, meta)
local termpoint = meta:get_string("termpoint")
if termpoint == "0% - 20%" then
meta:set_string("termpoint1", 0.0)
meta:set_string("termpoint2", 0.2)
elseif termpoint == "20% - 40%" then
meta:set_string("termpoint1", 0.2)
meta:set_string("termpoint2", 0.4)
elseif termpoint == "40% - 60%" then
meta:set_string("termpoint1", 0.4)
meta:set_string("termpoint2", 0.6)
elseif termpoint == "60% - 80%" then
meta:set_string("termpoint1", 0.6)
meta:set_string("termpoint2", 0.8)
elseif termpoint == "80% - 100%" then
meta:set_string("termpoint1", 0.8)
meta:set_string("termpoint2", 1.0)
elseif termpoint == "90% - 100%" then
meta:set_string("termpoint1", 0.9)
meta:set_string("termpoint2", 1.0)
else
meta:set_string("termpoint", "80% - 100%")
meta:set_string("termpoint1", 0.8)
meta:set_string("termpoint2", 1.0)
end
end
techage.power.percent = calc_percent
techage.CYCLES_PER_DAY = CYCLES_PER_DAY
techage.round = round
-------------------------------------------------------------------------------
-- Still used legacy functions
-------------------------------------------------------------------------------
function techage.formspec_label_bar(pos, x, y, label, max_power, current_power, unit)
local percent, ypos
max_power = max_power or 1
unit = unit or "ku"
current_power = current_power or 0
if current_power == 0 then
percent = 0
ypos = 2.8
else
percent = techage.power.percent(max_power, current_power)
-- 0.4 to 2.8 = 2.4
local offs = 2.4 - (current_power / max_power) * 2.4
ypos = 0.4 + in_range(offs, 0.4, 2.4)
end
if current_power >= 100 then
current_power = math.floor(current_power)
end
percent = (percent + 5) / 1.1 -- texture correction
return "container["..x..","..y.."]"..
"box[0,0;2.3,3.3;#395c74]"..
"label[0.2,0;"..label.."]"..
"label[0.7,0.4;"..max_power.." "..unit.."]"..
"image[0,0.5;1,3;"..
"techage_form_level_bg.png^[lowpart:"..percent..
":techage_form_level_fg.png]"..
"label[0.7,"..ypos..";"..current_power.." "..unit.."]"..
"container_end[]"
end
@@ -0,0 +1,146 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA2 Gearbox
]]--
-- for lazy programmers
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local PWR_NEEDED = 1
local CYCLE_TIME = 2
local Axle = techage.Axle
local power = networks.power
-- Axles texture animation
local function switch_axles(pos, on)
for _,outdir in ipairs(networks.get_outdirs(pos, Axle)) do
Axle:switch_tube_line(pos, outdir, on and "on" or "off")
end
end
local function swap_node(pos, name)
local node = techage.get_node_lvm(pos)
if node.name == name then
return
end
node.name = name
minetest.swap_node(pos, node)
end
local function node_timer_on(pos, elapsed)
local consumed = power.consume_power(pos, Axle, 0, PWR_NEEDED)
if consumed == 0 then
swap_node(pos, "techage:gearbox")
switch_axles(pos, false)
end
return true
end
local function node_timer_off(pos, elapsed)
if power.power_available(pos, Axle, 0) then
swap_node(pos, "techage:gearbox_on")
switch_axles(pos, true)
end
return true
end
-- to be able to restart the node after server crashes
local function techage_on_repair(pos)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
local function after_place_node(pos)
Axle:after_place_node(pos)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
local function after_dig_node(pos, oldnode)
Axle:after_dig_node(pos)
end
local function tubelib2_on_update2_on(pos, outdir, tlib2, node)
power.update_network(pos, 0, tlib2, node)
switch_axles(pos, true)
end
local function tubelib2_on_update2_off(pos, outdir, tlib2, node)
power.update_network(pos, 0, tlib2, node)
switch_axles(pos, false)
end
minetest.register_node("techage:gearbox", {
description = S("TA2 Gearbox"),
tiles = {"techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png"},
on_timer = node_timer_off,
techage_on_repair = techage_on_repair,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2_off,
paramtype = "light",
light_source = 0,
paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:gearbox_on", {
tiles = {
-- up, down, right, left, back, front
{
name = "techage_filling4_ta2.png^techage_axle_gearbox4.png^techage_frame4_ta2.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 0.6,
},
},
},
on_timer = node_timer_on,
techage_on_repair = techage_on_repair,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2_on,
paramtype2 = "facedir",
groups = {not_in_creative_inventory=1},
diggable = false,
drop = "",
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
power.register_nodes({"techage:gearbox", "techage:gearbox_on"}, Axle, "junc")
techage.register_node({"techage:gearbox", "techage:gearbox_on"}, {
on_node_load = function(pos, node)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
})
minetest.register_craft({
output = "techage:gearbox 2",
recipe = {
{"default:junglewood", "techage:axle", "default:wood"},
{"techage:axle", "techage:iron_ingot", "techage:axle"},
{"default:wood", "techage:axle", "default:junglewood"},
},
})
@@ -0,0 +1,66 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3/TA4 Junction box for electrical power distribution
]]--
-- for lazy programmers
local M = minetest.get_meta
local S = techage.S
local Cable = techage.ElectricCable
local power = networks.power
local size = 3/32
local Boxes = {
{{-size, -size, size, size, size, 0.5 }}, -- z+
{{-size, -size, -size, 0.5, size, size}}, -- x+
{{-size, -size, -0.5, size, size, size}}, -- z-
{{-0.5, -size, -size, size, size, size}}, -- x-
{{-size, -0.5, -size, size, size, size}}, -- y-
{{-size, -size, -size, size, 0.5, size}}, -- y+
}
local names = networks.register_junction("techage:electric_junction", 2/8, Boxes, Cable, {
description = S("TA Electric Junction Box"),
tiles = {"techage_electric_junction.png"},
use_texture_alpha = techage.CLIP,
is_ground_content = false,
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1},
sounds = default.node_sound_defaults(),
after_place_node = function(pos, placer, itemstack, pointed_thing)
local name = "techage:electric_junction" .. networks.junction_type(pos, Cable)
minetest.swap_node(pos, {name = name, param2 = 0})
Cable:after_place_node(pos)
end,
tubelib2_on_update2 = function(pos, dir1, tlib2, node)
if not networks.hidden_name(pos) then
local name = "techage:electric_junction" .. networks.junction_type(pos, Cable)
minetest.swap_node(pos, {name = name, param2 = 0})
end
power.update_network(pos, 0, tlib2, node)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
end,
})
power.register_nodes(names, Cable, "junc")
minetest.register_craft({
output = "techage:electric_junction0 2",
recipe = {
{"", "basic_materials:plastic_sheet", ""},
{"basic_materials:plastic_sheet", "default:copper_ingot", "basic_materials:plastic_sheet"},
{"", "basic_materials:plastic_sheet", ""},
},
})
@@ -0,0 +1,370 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3/TA4 Power line for electrical landline
]]--
-- for lazy programmers
local P = minetest.string_to_pos
local M = minetest.get_meta
local S = techage.S
local Cable = techage.ElectricCable
local power = networks.power
local function can_dig(pos, digger)
if digger and digger:is_player() then
if M(pos):get_string("owner") == digger:get_player_name() then
return true
end
if minetest.check_player_privs(digger:get_player_name(), "powerline") then
return true
end
end
return false
end
-- legacy node
minetest.register_node("techage:power_line", {
description = S("TA Power Line"),
tiles = {"techage_power_line.png"},
inventory_image = 'techage_power_line_inv.png',
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/32, -1/32, -4/8, 1/32, 1/32, 4/8},
},
},
selection_box = {
type = "fixed",
fixed = {-2/32, -2/32, -4/8, 2/32, 2/32, 4/8},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
drop = "techage:power_lineS",
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
})
-- new nodes lineS/lineA
minetest.register_node("techage:power_lineS", {
description = S("TA Power Line"),
tiles = {"techage_power_line.png"},
inventory_image = 'techage_power_line_inv.png',
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/32, -1/32, -4/8, 1/32, 1/32, 4/8},
},
},
selection_box = {
type = "fixed",
fixed = {-2/32, -2/32, -4/8, 2/32, 2/32, 4/8},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
drop = "techage:power_lineS",
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3},
sounds = default.node_sound_defaults(),
})
minetest.register_node("techage:power_lineA", {
description = S("TA Power Line"),
tiles = {
"techage_power_line.png",
"techage_power_line.png^[transformR180",
"techage_power_line.png^[transformR270",
"techage_power_line.png",
"techage_power_line.png",
"techage_power_line.png",
},
inventory_image = 'techage_power_line_inv.png',
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/32, -16/32, -1/32, 1/32, -15/32, 1/32},
{-1/32, -16/32, -2/32, 1/32, -14/32, 0/32},
{-1/32, -15/32, -3/32, 1/32, -13/32, -1/32},
{-1/32, -14/32, -4/32, 1/32, -12/32, -2/32},
{-1/32, -13/32, -5/32, 1/32, -11/32, -3/32},
{-1/32, -12/32, -6/32, 1/32, -10/32, -4/32},
{-1/32, -11/32, -7/32, 1/32, -9/32, -5/32},
{-1/32, -10/32, -8/32, 1/32, -8/32, -6/32},
{-1/32, -9/32, -9/32, 1/32, -7/32, -7/32},
{-1/32, -8/32, -10/32, 1/32, -6/32, -8/32},
{-1/32, -7/32, -11/32, 1/32, -5/32, -9/32},
{-1/32, -6/32, -12/32, 1/32, -4/32, -10/32},
{-1/32, -5/32, -13/32, 1/32, -3/32, -11/32},
{-1/32, -4/32, -14/32, 1/32, -2/32, -12/32},
{-1/32, -3/32, -15/32, 1/32, -1/32, -13/32},
{-1/32, -2/32, -16/32, 1/32, 0/32, -14/32},
{-1/32, -1/32, -16/32, 1/32, 1/32, -15/32},
},
},
selection_box = {
type = "fixed",
fixed = {-2/32, -16/32, 2/32, 2/32, 2/32, -16/32},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
drop = "techage:power_lineS",
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
})
minetest.register_node("techage:power_pole2", {
description = S("TA Power Pole Top 2 (for landlines)"),
tiles = {
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole.png"
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32},
{ -1/32, -6/32, -16/32, 1/32, -4/32, 16/32},
{ -2/32, -4/32, -16/32, 2/32, 4/32, -12/32},
{ -2/32, -4/32, 12/32, 2/32, 4/32, 16/32},
},
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
M(pos):set_string("owner", placer:get_player_name())
if techage.is_protected(pos, placer:get_player_name()) then
minetest.chat_send_player(placer:get_player_name(), "position is protected ")
minetest.remove_node(pos)
return true
end
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.chat_send_player(placer:get_player_name(), "invalid pole position ")
minetest.remove_node(pos)
Cable:after_dig_node(pos)
return true
end
return false
end,
can_dig = can_dig,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2},
sounds = default.node_sound_defaults(),
})
-- dummy node for the inventory and to be placed and imediately replaced
minetest.register_node("techage:power_pole", {
description = S("TA Power Pole Top (for up to 6 connections)"),
tiles = {
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole.png"
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32},
{-16/32, -6/32, -1/32, 16/32, -4/32, 1/32},
{ -1/32, -6/32, -16/32, 1/32, -4/32, 16/32},
{-16/32, -4/32, -2/32, -12/32, 4/32, 2/32},
{ 12/32, -4/32, -2/32, 16/32, 4/32, 2/32},
{ -2/32, -4/32, -16/32, 2/32, 4/32, -12/32},
{ -2/32, -4/32, 12/32, 2/32, 4/32, 16/32},
},
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
M(pos):set_string("owner", placer:get_player_name())
if techage.is_protected(pos, placer:get_player_name()) then
minetest.chat_send_player(placer:get_player_name(), "position is protected ")
minetest.remove_node(pos)
return true
end
local node = minetest.get_node(pos)
node.name = "techage:power_pole_conn"
minetest.swap_node(pos, node)
Cable:after_place_node(pos)
end,
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2},
})
-- secondary node like a junction
minetest.register_node("techage:power_pole_conn", {
description = "TA Power Pole Top (for up to 6 connections)",
tiles = {
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole.png"
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}},
connect_left = {{-16/32, -6/32, -1/32, 1/32, -4/32, 1/32},
{-16/32, -4/32, -2/32, -12/32, 4/32, 2/32}},
connect_right = {{ -1/32, -6/32, -1/32, 16/32, -4/32, 1/32},
{12/32, -4/32, -2/32, 16/32, 4/32, 2/32}},
connect_back = {{-1/32, -6/32, -1/32, 1/32, -4/32, 16/32},
{-2/32, -4/32, 12/32, 2/32, 4/32, 16/32}},
connect_front = {{-1/32, -6/32, -16/32, 1/32, -4/32, 1/32},
{-2/32, -4/32, -16/32, 2/32, 4/32, -12/32}},
},
connects_to = {"techage:power_line", "techage:power_lineS", "techage:power_lineA"},
can_dig = can_dig,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
end,
drop = "techage:power_pole",
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
})
power.register_nodes({"techage:power_pole_conn"}, Cable, "junc")
minetest.register_node("techage:power_pole3", {
description = S("TA Power Pole"),
tiles = {
"default_wood.png",
"default_wood.png",
"default_wood.png"
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2},
sounds = default.node_sound_defaults(),
})
minetest.register_craft({
output = "techage:power_lineS 24",
recipe = {
{"default:copper_ingot", "", ""},
{"", "default:copper_ingot", ""},
{"", "", "default:copper_ingot"},
},
})
minetest.register_craft({
output = "techage:power_pole2",
recipe = {
{"", "default:stick", ""},
{"techage:power_lineS", "default:copper_ingot", "techage:power_lineS"},
{"", "default:stick", ""},
},
})
minetest.register_craft({
output = "techage:power_pole",
recipe = {
{"", "", ""},
{"", "techage:power_pole2", ""},
{"", "techage:power_pole2", ""},
},
})
minetest.register_craft({
output = "techage:power_pole3 4",
recipe = {
{"", "group:wood", ""},
{"", "techage:power_lineS", ""},
{"", "group:wood", ""},
},
})
@@ -0,0 +1,15 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Power Terminal Old
]]--
minetest.register_alias_force("techage:power_terminal", "techage:ta3_power_terminal")
@@ -0,0 +1,342 @@
--[[
TechAge
=======
Copyright (C) 2019-2023 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Power Terminal
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local M = minetest.get_meta
local N = function(pos) return minetest.get_node(pos).name end
local S = techage.S
local CYCLE_TIME = 2
local Cable = techage.ElectricCable
local power = networks.power
local control = networks.control
local HELP = S([[Commands
help . . . print this text
cls . . . . clear screen
gen . . print generators
sto . . print storage systems
con1 . . print consumers with power consumption between 1 and 10 ku
con2 . . print consumers with power consumption with 10 ku or above
]])
local function row(num, label, data)
local y = 4.0 + num * 0.5
return
"box[0," .. y .. ";9.8,0.4;#395c74]"..
"label[0.2,"..y..";" .. label .. "]" ..
"label[8.5,"..y..";" .. data .. "]"
end
local function formspec1(pos, data)
local mem = techage.get_mem(pos)
local outdir = M(pos):get_int("outdir")
local netw = networks.get_network_table(pos, Cable, outdir, true) or {}
data = data or power.get_network_data(pos, Cable, outdir)
mem.star = ((mem.star or 0) + 1) % 2
local star = mem.star == 1 and "*" or ""
local storage_provided = math.max(data.consumed - data.available, 0)
local available = math.max(data.consumed, data.available)
return "size[10,8]"..
"tabheader[0,0;tab;status,console;1;;true]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"box[0,-0.1;9.8,0.5;#c6e8ff]"..
"label[0.2,-0.1;"..minetest.colorize( "#000000", S("Network Data")).."]"..
"label[9.5,-0.1;"..minetest.colorize( "#000000", star).."]"..
techage.formspec_power_bar(pos, 0.0, 0.7, S("Generator"), data.provided, data.available)..
techage.formspec_power_bar(pos, 2.5, 0.7, S("Consumer"), data.consumed, available)..
techage.formspec_charging_bar(pos, 5.0, 0.7, S("Charging"), data)..
techage.formspec_storage_bar(pos, 7.5, 0.7, S("Storage"), data.curr_load, data.max_capa)..
row(1, S("Number of network nodes:"), netw.num_nodes or 0) ..
row(2, S("Number of generators:"), #(netw.gen or {})) ..
row(3, S("Number of consumers:"), #(netw.con or {})) ..
row(4, S("Number of storage systems:"), #(netw.sto or {}))
end
local function formspec2(pos)
local mem = techage.get_mem(pos)
local meta = M(pos)
local output = meta:get_string("output")
local command = mem.cmnd or "help"
output = minetest.formspec_escape(output)
output = output:gsub("\n", ",")
return "size[10,8]"..
"tabheader[0,0;tab;status,console;2;;true]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"box[0,-0.1;9.8,0.5;#c6e8ff]"..
"label[0.2,-0.1;"..minetest.colorize( "#000000", S("Network Data")).."]"..
--"style_type[table,field;font=mono]"..
"table[0,0.5;9.8,6.8;output;"..output..";200]"..
"field[0.4,7.7;7.6,1;cmnd;;"..command.."]" ..
"field_close_on_enter[cmnd;false]"..
"button[7.9,7.4;2,1;enter;"..S("Enter").."]"
end
--------------------------------------------------------------------------------------
--Overwrite networks.power.consume_power function
--------------------------------------------------------------------------------------
local origin_consume_power = networks.power.consume_power
function networks.power.consume_power(pos, tlib2, outdir, amount)
local nvm = techage.get_nvm(pos)
nvm.power_taken = origin_consume_power(pos, tlib2, outdir, amount)
return nvm.power_taken
end
local function get_consumer_power_consumption(pos)
if pos then
local nvm = techage.get_nvm(pos)
if nvm.running or techage.needs_power(nvm) then
return nvm.power_taken or 0
end
end
return 0
end
local function generators(pos)
local tbl = {}
local outdir = M(pos):get_int("outdir")
local resp = control.request(pos, Cable, outdir, "gen", "info")
for _, item in ipairs(resp) do
if item.running then
local s = string.format("%s (%s): %s/%u ku (%s)",
item.type, item.number, techage.round(item.provided), item.available, item.termpoint)
tbl[#tbl + 1] = s
else
local s = string.format("%s (%s): off",
item.type, item.number)
tbl[#tbl + 1] = s
end
end
table.sort(tbl)
return table.concat(tbl, "\n")
end
local function storages(pos)
local tbl = {}
local outdir = M(pos):get_int("outdir")
local resp = control.request(pos, Cable, outdir, "sto", "info")
for _, item in ipairs(resp) do
-- TA4/TA5 heatexchangers are no storage systems
if item.capa and item.capa > 1 then
if item.running then
local s = string.format("%s (%s): %s/%s kud",
item.type, item.number,
techage.round(item.load / techage.CYCLES_PER_DAY),
techage.round(item.capa / techage.CYCLES_PER_DAY))
tbl[#tbl + 1] = s
else
local s = string.format("%s (%s): %s/%s kud (off)",
item.type, item.number,
techage.round(item.load / techage.CYCLES_PER_DAY),
techage.round(item.capa / techage.CYCLES_PER_DAY))
tbl[#tbl + 1] = s
end
end
end
table.sort(tbl)
return table.concat(tbl, "\n")
end
local function consumers(pos, min, max)
local tbl = {}
local outdir = M(pos):get_int("outdir")
local netw = networks.get_network_table(pos, Cable, outdir) or {}
for _,item in ipairs(netw.con or {}) do
local number = techage.get_node_number(item.pos)
if number then
local name = techage.get_node_lvm(item.pos).name
name = (minetest.registered_nodes[name] or {}).description or "unknown"
local taken = techage.round(get_consumer_power_consumption(item.pos))
if taken > min and taken < max then
tbl[#tbl + 1] = string.format("%s (%s): %s ku", name, number, taken)
end
else
local name = techage.get_node_lvm(item.pos).name
name = (minetest.registered_nodes[name] or {}).description or "unknown"
local taken = techage.round(get_consumer_power_consumption(item.pos))
if taken > min and taken < max then
tbl[#tbl + 1] = string.format("%s: %s ku", name, taken)
end
end
end
table.sort(tbl)
return table.concat(tbl, "\n")
end
local function output(pos, command, text)
local meta = M(pos)
text = meta:get_string("output") .. "\n$ " .. command .. "\n" .. (text or "")
text = text:sub(-5000,-1)
meta:set_string("output", text)
end
local function command(pos, nvm, command)
local meta = M(pos)
if command then
command = command:sub(1,80)
command = string.trim(command)
local cmd, data = unpack(string.split(command, " ", false, 1))
if cmd == "cls" then
meta:set_string("output", "")
elseif cmd == "help" then
output(pos, command, HELP)
elseif cmd == "gen" then
output(pos, command, generators(pos))
elseif cmd == "sto" then
output(pos, command, storages(pos))
elseif cmd == "con1" then
output(pos, command, consumers(pos, 1, 10))
elseif cmd == "con2" then
output(pos, command, consumers(pos, 9, 1000))
elseif command ~= "" then
output(pos, command, "")
end
end
end
minetest.register_node("techage:ta3_power_terminal", {
description = S("TA3 Power Terminal"),
inventory_image = "techage_power_terminal_front.png",
tiles = {
"techage_power_terminal_top.png",
"techage_power_terminal_top.png",
"techage_power_terminal_side.png",
"techage_power_terminal_side.png",
"techage_power_terminal_back.png",
"techage_power_terminal_front.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -8/16, -8/16, 0/16, 8/16, 8/16, 8/16},
},
},
after_place_node = function(pos, placer)
M(pos):set_int("outdir", networks.side_to_outdir(pos, "B"))
Cable:after_place_node(pos)
M(pos):set_string("formspec", formspec1(pos))
local number = techage.add_node(pos, "techage:ta3_power_terminal")
M(pos):set_string("node_number", number)
M(pos):set_string("owner", placer:get_player_name())
M(pos):set_string("infotext", S("TA3 Power Terminal").." "..number)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
techage.remove_node(pos, oldnode, oldmetadata)
techage.del_mem(pos)
end,
on_rightclick = function(pos, node, clicker)
local mem = techage.get_mem(pos)
if mem.active_formspec == 2 then
M(pos):set_string("formspec", formspec2(pos))
else
M(pos):set_string("formspec", formspec1(pos))
minetest.get_node_timer(pos):start(CYCLE_TIME)
techage.set_activeformspec(pos, clicker)
mem.active_formspec = 1
end
end,
on_timer = function(pos, elapsed)
if techage.is_activeformspec(pos) then
local outdir = M(pos):get_int("outdir")
local data = power.get_network_data(pos, Cable, outdir)
M(pos):set_string("formspec", formspec1(pos, data))
return true
end
end,
on_receive_fields = function(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local nvm = techage.get_nvm(pos)
local mem = techage.get_mem(pos)
if fields.key_enter_field or fields.enter then
command(pos, nvm, fields.cmnd)
mem.cmnd = ""
M(pos):set_string("formspec", formspec2(pos, mem))
mem.cmnd = fields.cmnd
elseif fields.tab == "1" then
M(pos):set_string("formspec", formspec1(pos))
techage.set_activeformspec(pos, player)
minetest.get_node_timer(pos):start(CYCLE_TIME)
mem.active_formspec = 1
elseif fields.tab == "2" then
M(pos):set_string("formspec", formspec2(pos))
techage.reset_activeformspec(pos, player)
mem.active_formspec = 2
elseif fields.key_up and mem.cmnd then
M(pos):set_string("formspec", formspec2(pos))
end
end,
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = techage.CLIP,
on_rotate = screwdriver.disallow,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky = 2, level = 2},
sounds = default.node_sound_metal_defaults(),
})
power.register_nodes({"techage:ta3_power_terminal"}, Cable, "con", {"B"})
techage.register_node({"techage:ta3_power_terminal"}, {
on_recv_message = function(pos, src, topic, payload)
if topic == "load" then
local outdir = M(pos):get_int("outdir")
local value = networks.power.get_storage_percent(pos, Cable, outdir)
return techage.round(value)
else
return "unsupported"
end
end,
on_beduino_request_data = function(pos, src, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == 134 then
local outdir = M(pos):get_int("outdir")
local value = networks.power.get_storage_percent(pos, Cable, outdir)
return 0, {math.floor(value + 0.5)}
else
return 2, ""
end
end,
})
minetest.register_craft({
output = "techage:ta3_power_terminal",
recipe = {
{"", "techage:usmium_nuggets", "default:steel_ingot"},
{"", "techage:basalt_glass_thin", "default:copper_ingot"},
{"", "techage:vacuum_tube", "default:steel_ingot"},
},
})
@@ -0,0 +1,303 @@
--[[
TechAge
=======
Copyright (C) 2019-2022 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Power Switch (large and small)
]]--
-- for lazy programmers
local P = minetest.string_to_pos
local M = minetest.get_meta
local S = techage.S
local Cable = techage.ElectricCable
local power = networks.power
local Param2ToDir = {
[0] = 6,
[1] = 5,
[2] = 2,
[3] = 4,
[4] = 1,
[5] = 3,
}
local function sign_in(pos, node)
local dir = Param2ToDir[node.param2]
local pos2 = tubelib2.get_pos(pos, dir)
M(pos2):set_int("switch_sign_in", 1)
end
local function sign_off(pos, node)
local dir = Param2ToDir[node.param2]
local pos2 = tubelib2.get_pos(pos, dir)
M(pos2):set_int("switch_sign_in", 0)
end
local function switch_on(pos, node, clicker, name)
if clicker and minetest.is_protected(pos, clicker:get_player_name()) then
return
end
node.name = name
minetest.swap_node(pos, node)
minetest.sound_play("techage_button", {
pos = pos,
gain = 0.5,
max_hear_distance = 5,
})
local dir = Param2ToDir[node.param2]
local pos2 = tubelib2.get_pos(pos, dir)
techage.legacy_switches(pos2)
power.turn_switch_on(pos2, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on")
end
local function switch_off(pos, node, clicker, name)
if clicker and minetest.is_protected(pos, clicker:get_player_name()) then
return
end
node.name = name
minetest.swap_node(pos, node)
minetest.get_node_timer(pos):stop()
minetest.sound_play("techage_button", {
pos = pos,
gain = 0.5,
max_hear_distance = 5,
})
local dir = Param2ToDir[node.param2]
local pos2 = tubelib2.get_pos(pos, dir)
techage.legacy_switches(pos2)
power.turn_switch_off(pos2, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on")
end
minetest.register_node("techage:powerswitch", {
description = S("TA Power Switch"),
inventory_image = "techage_appl_switch_inv.png",
tiles = {
'techage_appl_switch_off.png',
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -1/4, -8/16, -1/4, 1/4, -7/16, 1/4},
{ -1/6, -12/16, -1/6, 1/6, -8/16, 1/6},
},
},
after_place_node = function(pos, placer)
local meta = M(pos)
local number = techage.add_node(pos, "techage:powerswitch")
meta:set_string("node_number", number)
meta:set_string("owner", placer:get_player_name())
meta:set_string("infotext", S("TA Power Switch").." "..number)
local node = minetest.get_node(pos)
switch_on(pos, node, placer, "techage:powerswitch_on")
sign_in(pos, node)
end,
on_rightclick = function(pos, node, clicker)
switch_on(pos, node, clicker, "techage:powerswitch_on")
end,
after_dig_node = sign_off,
on_rotate = screwdriver.disallow,
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:powerswitch_on", {
description = S("TA Power Switch"),
inventory_image = "techage_appl_switch_inv.png",
tiles = {
'techage_appl_switch_on.png',
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -1/4, -8/16, -1/4, 1/4, -7/16, 1/4},
{ -1/6, -12/16, -1/6, 1/6, -8/16, 1/6},
},
},
on_rightclick = function(pos, node, clicker)
switch_off(pos, node, clicker, "techage:powerswitch")
end,
after_dig_node = sign_off,
drop = "techage:powerswitch",
on_rotate = screwdriver.disallow,
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:powerswitchsmall", {
description = S("TA Power Switch Small"),
inventory_image = "techage_smart_button_inventory.png",
tiles = {
'techage_smart_button_off.png',
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -5/32, -16/32, -5/32, 5/32, -15/32, 5/32},
{ -2/16, -12/16, -2/16, 2/16, -8/16, 2/16},
},
},
after_place_node = function(pos, placer)
local meta = M(pos)
local number = techage.add_node(pos, "techage:powerswitchsmall")
meta:set_string("node_number", number)
meta:set_string("owner", placer:get_player_name())
meta:set_string("infotext", S("TA Power Switch Small").." "..number)
local node = minetest.get_node(pos)
switch_on(pos, node, placer, "techage:powerswitchsmall_on")
sign_in(pos, node)
end,
on_rightclick = function(pos, node, clicker)
switch_on(pos, node, clicker, "techage:powerswitchsmall_on")
end,
after_dig_node = sign_off,
on_rotate = screwdriver.disallow,
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("techage:powerswitchsmall_on", {
description = S("TA Power Switch Small"),
inventory_image = "techage_appl_switch_inv.png",
tiles = {
'techage_smart_button_on.png',
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -5/32, -16/32, -5/32, 5/32, -15/32, 5/32},
{ -2/16, -12/16, -2/16, 2/16, -8/16, 2/16},
},
},
on_rightclick = function(pos, node, clicker)
switch_off(pos, node, clicker, "techage:powerswitchsmall")
end,
after_dig_node = sign_off,
drop = "techage:powerswitchsmall",
on_rotate = screwdriver.disallow,
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
paramtype2 = "wallmounted",
groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
techage.register_node({"techage:powerswitch", "techage:powerswitch_on",
"techage:powerswitchsmall", "techage:powerswitchsmall_on"}, {
on_recv_message = function(pos, src, topic, payload)
local node = techage.get_node_lvm(pos)
if topic == "on" and node.name == "techage:powerswitch" then
switch_on(pos, node, nil, "techage:powerswitch_on")
return true
elseif topic == "on" and node.name == "techage:powerswitchsmall" then
switch_on(pos, node, nil, "techage:powerswitchsmall_on")
return true
elseif topic == "off" and node.name == "techage:powerswitch_on" then
switch_off(pos, node, nil, "techage:powerswitch")
return true
elseif topic == "off" and node.name == "techage:powerswitchsmall_on" then
switch_off(pos, node, nil, "techage:powerswitchsmall")
return true
elseif topic == "state" then
if node.name == "techage:powerswitch_on" or
node.name == "techage:powerswitchsmall_on" then
return "on"
end
return "off"
else
return "unsupported"
end
end,
on_beduino_receive_cmnd = function(pos, src, topic, payload)
local node = techage.get_node_lvm(pos)
if topic == 1 and payload[1] == 1 and node.name == "techage:powerswitch" then
switch_on(pos, node, nil, "techage:powerswitch_on")
return 0
elseif topic == 1 and payload[1] == 1 and node.name == "techage:powerswitchsmall" then
switch_on(pos, node, nil, "techage:powerswitchsmall_on")
return 0
elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitch_on" then
switch_off(pos, node, nil, "techage:powerswitch")
return 0
elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitchsmall_on" then
switch_off(pos, node, nil, "techage:powerswitchsmall")
return 0
else
return 2
end
end,
on_beduino_request_data = function(pos, src, topic, payload)
local node = techage.get_node_lvm(pos)
if topic == 131 or topic == 142 then
if node.name == "techage:powerswitch_on" or
node.name == "techage:powerswitchsmall_on" then
return 0, {1}
end
return 0, {0}
else
return 2, ""
end
end,
})
minetest.register_craft({
output = "techage:powerswitch 2",
recipe = {
{"", "", ""},
{"dye:yellow", "dye:red", "dye:yellow"},
{"basic_materials:plastic_sheet", "basic_materials:copper_wire", "basic_materials:plastic_sheet"},
},
})
minetest.register_craft({
type = "shapeless",
output = "techage:powerswitchsmall",
recipe = {"techage:powerswitch"},
})
@@ -0,0 +1,148 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Power Switch Box
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local M = minetest.get_meta
local N = techage.get_node_lvm
local S = techage.S
local Cable = techage.ElectricCable
local power = networks.power
local node_box = {
type = "fixed",
fixed = {
{ -1/4, -1/4, -2/4, 1/4, 1/4, 2/4},
},
}
function techage.legacy_switches(pos)
local meta = M(pos)
local node = N(pos)
if node.name == "techage:powerswitch_box" then
if meta:get_int("netw_param2") == 0 then
node.name = "techage:powerswitch_box_off"
else
node.name = "techage:powerswitch_box_on"
end
minetest.swap_node(pos, node)
elseif meta:get_string("netw_name") == "techage:powerswitch_box" then
if meta:get_int("netw_param2") == 0 then
meta:set_string("netw_name", "techage:powerswitch_box_off")
else
meta:set_string("netw_name", "techage:powerswitch_box_on")
end
end
if meta:contains("tl2_param2_copy") then
meta:set_string("netw_param2_copy", meta:get_string("tl2_param2_copy"))
meta:set_string("tl2_param2_copy", "")
end
end
-- The on-switch is a "primary node" like cables
minetest.register_node("techage:powerswitch_box_on", {
description = S("TA Power Switch Box"),
paramtype = "light",
drawtype = "nodebox",
node_box = node_box,
tiles = {
"techage_electric_switch.png^[transformR90",
"techage_electric_switch.png^[transformR90",
"techage_electric_switch.png",
"techage_electric_switch.png",
"techage_electric_junction.png",
"techage_electric_junction.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
on_rightclick = function(pos, node, clicker)
techage.legacy_switches(pos)
if M(pos):get_int("switch_sign_in") ~= 1 then
if power.turn_switch_off(pos, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") then
minetest.sound_play("doors_glass_door_open", {
pos = pos,
gain = 1,
max_hear_distance = 5})
end
end
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1},
sounds = default.node_sound_defaults(),
})
-- The off-switch is a "secondary node" without connection sides
minetest.register_node("techage:powerswitch_box_off", {
description = S("TA Power Switch Box"),
paramtype = "light",
drawtype = "nodebox",
node_box = node_box,
tiles = {
"techage_electric_switch_off.png^[transformR90",
"techage_electric_switch_off.png^[transformR90",
"techage_electric_switch_off.png",
"techage_electric_switch_off.png",
"techage_electric_junction.png",
"techage_electric_junction.png",
},
on_rightclick = function(pos, node, clicker)
techage.legacy_switches(pos)
if M(pos):get_int("switch_sign_in") ~= 1 then
if power.turn_switch_on(pos, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") then
minetest.sound_play("doors_glass_door_open", {
pos = pos,
gain = 1,
max_hear_distance = 5})
end
end
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
end,
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
drop = "techage:powerswitch_box_on",
groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
})
power.register_nodes({"techage:powerswitch_box_off"}, Cable, "con", {})
minetest.register_craft({
output = "techage:powerswitch_box_on",
recipe = {
{"", "basic_materials:plastic_sheet", ""},
{"techage:electric_cableS", "basic_materials:copper_wire", "techage:electric_cableS"},
{"", "basic_materials:plastic_sheet", ""},
},
})
@@ -0,0 +1,71 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3 Old Power Switch Box
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local M = minetest.get_meta
local N = function(pos) return minetest.get_node(pos).name end
local S = techage.S
local Cable = techage.ElectricCable
local power = networks.power
local node_box = {
type = "fixed",
fixed = {
{ -1/4, -1/4, -2/4, 1/4, 1/4, 2/4},
},
}
-- legacy node
minetest.register_node("techage:powerswitch_box", {
description = S("TA Power Switch Box"),
tiles = {
-- up, down, right, left, back, front
'techage_electric_switch.png^[transformR90',
'techage_electric_switch.png^[transformR90',
'techage_electric_switch.png',
'techage_electric_switch.png',
'techage_electric_junction.png',
'techage_electric_junction.png',
},
drawtype = "nodebox",
node_box = node_box,
after_place_node = function(pos, placer, itemstack, pointed_thing)
local node = minetest.get_node(pos)
minetest.swap_node(pos, {name = "techage:powerswitch_box_on", param2 = node.param2})
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
on_rotate = screwdriver.disallow, -- important!
paramtype2 = "facedir",
drop = "techage:powerswitch_box_on",
groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1, not_in_creative_inventory = 1},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
@@ -0,0 +1,71 @@
--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA3/TA4 Power line Protection
]]--
local M = minetest.get_meta
local S = techage.S
local RANGE = 8
local IsNodeUnderObservation = {}
-- Register all nodes, which should be protected by the "techage:power_pole"
function techage.register_powerline_node(name)
IsNodeUnderObservation[name] = true
end
local function powerpole_found(pos, name, range)
local pos1 = {x=pos.x-range, y=pos.y-range, z=pos.z-range}
local pos2 = {x=pos.x+range, y=pos.y+range, z=pos.z+range}
for _,npos in ipairs(minetest.find_nodes_in_area(pos1, pos2, {
"techage:power_pole", "techage:power_pole_conn",
"techage:power_pole2"})) do
if minetest.get_meta(npos):get_string("owner") ~= name then
return true
end
end
return false
end
local function is_protected(pos, name, range)
if minetest.check_player_privs(name, "powerline")
or not powerpole_found(pos, name, range) then
return false
end
return true
end
function techage.is_protected(pos, name)
return is_protected(pos, name, RANGE+3)
end
local old_is_protected = minetest.is_protected
function minetest.is_protected(pos, name)
local node = techage.get_node_lvm(pos)
if IsNodeUnderObservation[node.name] and is_protected(pos, name, RANGE) then
return true
end
return old_is_protected(pos, name)
end
minetest.register_privilege("powerline", {
description = S("Allow to dig/place Techage power lines nearby power poles"),
give_to_singleplayer = false,
give_to_admin = true,
})
techage.register_powerline_node("techage:power_line")
techage.register_powerline_node("techage:power_lineS")
techage.register_powerline_node("techage:power_lineA")
techage.register_powerline_node("techage:power_pole3")
@@ -0,0 +1,116 @@
--[[
TechAge
=======
Copyright (C) 2019-2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA2 Steam pipes for the Steam Engine
]]--
-- for lazy programmers
local P = minetest.string_to_pos
local M = minetest.get_meta
local S = techage.S
local Pipe = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6},
max_tube_length = 12,
show_infotext = false,
force_to_use_tubes = true,
tube_type = "pipe1",
primary_node_names = {"techage:steam_pipeS", "techage:steam_pipeA"},
secondary_node_names = {"techage:cylinder", "techage:cylinder_on", "techage:boiler2"},
after_place_tube = function(pos, param2, tube_type, num_tubes)
minetest.swap_node(pos, {name = "techage:steam_pipe"..tube_type, param2 = param2})
end,
})
minetest.register_node("techage:steam_pipeS", {
description = S("TA2 Steam Pipe"),
tiles = {
"techage_steam_pipe.png^[transformR90",
"techage_steam_pipe.png^[transformR90",
"techage_steam_pipe.png",
"techage_steam_pipe.png",
"techage_steam_hole.png",
"techage_steam_hole.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Pipe:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Pipe:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/8, -1/8, -4/8, 1/8, 1/8, 4/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {crumbly=3, cracky=3, snappy=3},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:steam_pipeA", {
description = S("TA2 Steam Pipe"),
tiles = {
"techage_steam_knee2.png",
"techage_steam_hole2.png^[transformR180",
"techage_steam_knee.png^[transformR270",
"techage_steam_knee.png",
"techage_steam_knee2.png",
"techage_steam_hole2.png",
},
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Pipe:after_dig_tube(pos, oldnode, oldmetadata)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/8, -4/8, -1/8, 1/8, 1/8, 1/8},
{-1/8, -1/8, -4/8, 1/8, 1/8, -1/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {crumbly=3, cracky=3, snappy=3, not_in_creative_inventory=1},
sounds = default.node_sound_metal_defaults(),
drop = "techage:steam_pipeS",
})
minetest.register_craft({
output = "techage:steam_pipeS 3",
recipe = {
{'', '', "default:bronze_ingot"},
{'', 'techage:iron_ingot', ''},
{"default:bronze_ingot", '', ''},
},
})
techage.SteamPipe = Pipe
@@ -0,0 +1,189 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA4 Low Power Cable for solar plants
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local power = networks.power
local ELE2_MAX_CABLE_LENGHT = 200
local Cable = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6},
max_tube_length = ELE2_MAX_CABLE_LENGHT,
show_infotext = false,
tube_type = "ele2",
primary_node_names = {"techage:ta4_power_cableS", "techage:ta4_power_cableA",
"techage:ta4_cable_wall_entry"},
secondary_node_names = {},
after_place_tube = function(pos, param2, tube_type, num_tubes)
local name = minetest.get_node(pos).name
if name == "techage:ta4_cable_wall_entry" then
minetest.swap_node(pos, {name = "techage:ta4_cable_wall_entry", param2 = param2})
else
minetest.swap_node(pos, {name = "techage:ta4_power_cable"..tube_type, param2 = param2})
end
end,
})
-- Use global callback instead of node related functions
Cable:register_on_tube_update2(function(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2, node)
end)
minetest.register_node("techage:ta4_power_cableS", {
description = S("TA4 Low Power Cable"),
tiles = {
-- up, down, right, left, back, front
"techage_ta4_cable.png",
"techage_ta4_cable.png",
"techage_ta4_cable.png",
"techage_ta4_cable.png",
"techage_ta4_cable_end.png",
"techage_ta4_cable_end.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/16, -1/16, -4/8, 1/16, 1/16, 4/8},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3},
sounds = default.node_sound_defaults(),
})
minetest.register_node("techage:ta4_power_cableA", {
description = S("TA4 Low Power Cable"),
tiles = {
-- up, down, right, left, back, front
"techage_ta4_cable.png",
"techage_ta4_cable_end.png",
"techage_ta4_cable.png",
"techage_ta4_cable.png",
"techage_ta4_cable.png",
"techage_ta4_cable_end.png",
},
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-1/16, -4/8, -1/16, 1/16, 1/16, 1/16},
{-1/16, -1/16, -4/8, 1/16, 1/16, -1/16},
},
},
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(),
drop = "techage:ta4_power_cableS",
})
minetest.register_node("techage:ta4_power_box", {
description = S("TA4 Low Power Box"),
tiles = {
"techage_ta4_junctionbox_top.png",
"techage_ta4_junctionbox_top.png",
"techage_ta4_junctionbox_side.png^techage_appl_ta4_cable.png",
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {
{ -3/16, -3/16, -3/16, 3/16, 3/16, 3/16}, -- box
{ -1/16, -7/16, -1/16, 1/16, -3/16, 1/16}, -- post
{ -3/16, -8/16, -3/16, 3/16, -7/16, 3/16}, -- base
},
connect_left = {{ -1/2, -1/16, -1/16, 0, 1/16, 1/16}},
connect_right = {{ 0, -1/16, -1/16, 1/2, 1/16, 1/16}},
connect_back = {{-1/16, -1/16, 0, 1/16, 1/16, 1/2}},
connect_front = {{-1/16, -1/16, -1/2, 1/16, 1/16, 0}},
},
connects_to = {"techage:ta4_power_cableA", "techage:ta4_power_cableS",
"techage:ta4_solar_inverter", "techage:ta4_solar_carrier",
"techage:ta4_solar_carrierB", "techage:ta4_cable_wall_entry"},
after_place_node = function(pos, placer, itemstack, pointed_thing)
Cable:after_place_node(pos)
end,
tubelib2_on_update2 = function(pos, dir1, tlib2, node)
power.update_network(pos, 0, tlib2, node)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
end,
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
use_texture_alpha = techage.CLIP,
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2},
sounds = default.node_sound_defaults(),
})
power.register_nodes({"techage:ta4_power_box"}, Cable, "junc", {"L", "R", "F", "B"})
minetest.register_craft({
output = "techage:ta4_power_cableS 8",
recipe = {
{"basic_materials:plastic_sheet", "dye:red", ""},
{"", "default:copper_ingot", ""},
{"", "dye:red", "basic_materials:plastic_sheet"},
},
})
minetest.register_craft({
output = "techage:ta4_power_box 2",
recipe = {
{"techage:ta4_power_cableS", "basic_materials:plastic_sheet", "techage:ta4_power_cableS"},
{"basic_materials:plastic_sheet", "default:copper_ingot", "basic_materials:plastic_sheet"},
{"techage:ta4_power_cableS", "basic_materials:plastic_sheet", "techage:ta4_power_cableS"},
},})
techage.TA4_Cable = Cable
@@ -0,0 +1,57 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA4 cable wall entry
]]--
local S = techage.S
local TA4_Cable = techage.TA4_Cable
minetest.register_node("techage:ta4_cable_wall_entry", {
description = S("TA4 Cable Wall Entry"),
tiles = {
-- up, down, right, left, back, front
"basic_materials_concrete_block.png",
"basic_materials_concrete_block.png",
"basic_materials_concrete_block.png",
"basic_materials_concrete_block.png",
"basic_materials_concrete_block.png^techage_ta4_cable_hole.png",
"basic_materials_concrete_block.png^techage_ta4_cable_hole.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
if not TA4_Cable:after_place_tube(pos, placer, pointed_thing) then
minetest.remove_node(pos)
return true
end
return false
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
TA4_Cable:after_dig_tube(pos, oldnode)
end,
paramtype2 = "facedir", -- important!
on_rotate = screwdriver.disallow, -- important!
groups = {crumbly = 2, cracky = 2, snappy = 2},
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
})
minetest.register_craft({
output = "techage:ta4_cable_wall_entry",
recipe = {
{"", "techage:ta4_power_cableS", ""},
{"", "basic_materials:concrete_block", ""},
{"", "",""},
},
})