mods that hopefully work for a TechAge-based pack
This commit is contained in:
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", ""},
|
||||
{"", "",""},
|
||||
},
|
||||
})
|
||||
Reference in new issue
Block a user