From b6e931c86c42e5f0c2aa60281b6441f665081f86 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 5 May 2019 22:29:00 +0200 Subject: [PATCH] further coal power plant nodes added --- coal_power_station/boiler_base.lua | 125 ++++++++++++++++++ .../{boiler.lua => boiler_top.lua} | 95 ++++--------- coal_power_station/firebox.lua | 21 +++ coal_power_station/generator.lua | 102 ++++++++++---- coal_power_station/turbine.lua | 48 ++++--- init.lua | 9 +- sounds/techage_turbine.ogg | Bin 0 -> 15804 bytes steam_engine/boiler.lua | 1 + steam_engine/flywheel.lua | 2 + steam_engine/help.lua | 2 +- test/generator.lua | 6 +- textures/techage_appl_generator.png | Bin 0 -> 423 bytes textures/techage_appl_turbine.png | Bin 0 -> 410 bytes textures/techage_appl_turbine4.png | Bin 0 -> 751 bytes textures/techage_coal_boiler_mesh.png | Bin 1453 -> 1400 bytes textures/techage_coal_boiler_mesh_base.png | Bin 0 -> 1393 bytes textures/techage_coal_boiler_mesh_top.png | Bin 0 -> 1400 bytes 17 files changed, 294 insertions(+), 117 deletions(-) create mode 100644 coal_power_station/boiler_base.lua rename coal_power_station/{boiler.lua => boiler_top.lua} (79%) create mode 100644 sounds/techage_turbine.ogg create mode 100644 textures/techage_appl_generator.png create mode 100644 textures/techage_appl_turbine.png create mode 100644 textures/techage_appl_turbine4.png create mode 100644 textures/techage_coal_boiler_mesh_base.png create mode 100644 textures/techage_coal_boiler_mesh_top.png diff --git a/coal_power_station/boiler_base.lua b/coal_power_station/boiler_base.lua new file mode 100644 index 0000000..e66fe9c --- /dev/null +++ b/coal_power_station/boiler_base.lua @@ -0,0 +1,125 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + TA3 Coal Power Station Boiler Base + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("techage") +local I,_ = dofile(MP.."/intllib.lua") + +local POWER_CONSUMPTION = 2 +local STANDBY_TICKS = 4 +local CYCLE_TIME = 4 + +local Pipe = techage.SteamPipe +local consumer = techage.consumer + +local function valid_power_dir(pos, power_dir, in_dir) + return power_dir == in_dir +end + +local function start_node(pos, mem, state) + consumer.turn_power_on(pos, POWER_CONSUMPTION) +end + +local function stop_node(pos, mem, state) + consumer.turn_power_on(pos, 0) +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:coalboiler_base", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + start_node = start_node, + stop_node = stop_node, +}) + +local function turn_on_clbk(pos, in_dir, sum) + local mem = tubelib2.get_mem(pos) + local state = State:get_state(mem) + + if sum > 0 and state == techage.STOPPED then + State:start(pos, mem) + elseif sum <= 0 and state == techage.RUNNING then + State:stop(pos, mem) + end +end + +local function node_timer(pos, elapsed) + print("node_timer") + local mem = tubelib2.get_mem(pos) + return State:is_active(mem) +end + +minetest.register_node("techage:coalboiler_base", { + description = I("TA3 Boiler Base"), + tiles = {"techage_coal_boiler_mesh_base.png"}, + drawtype = "mesh", + mesh = "techage_boiler_large.obj", + selection_box = { + type = "fixed", + fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, + }, + + techage = { + turn_on = turn_on_clbk, + read_power_consumption = consumer.read_power_consumption, + power_network = Pipe, + power_side = "F", + valid_power_dir = valid_power_dir, + }, + + after_place_node = function(pos, placer) + local mem = consumer.after_place_node(pos, placer) + State:node_init(pos, mem, "") + State:start(pos, mem) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + State:after_dig_node(pos, oldnode, oldmetadata, digger) + consumer.after_dig_node(pos, oldnode) + end, + + after_tube_update = consumer.after_tube_update, + --on_timer = node_timer, + + paramtype2 = "facedir", + on_rotate = screwdriver.disallow, + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +Pipe:add_secondary_node_names({"techage:coalboiler_base"}) + + +minetest.register_craft({ + output = "techage:coalboiler_base", + recipe = { + {"default:stone", "", "default:stone"}, + {"techage:iron_ingot", "", "techage:iron_ingot"}, + {"default:stone", "default:stone", "default:stone"}, + }, +}) + +techage.register_help_page(I("TA3 Boiler Base"), +I([[Part of the Coal Power Station. +Has to be placed on top of the +TA3 Coal Power Station Firebox +and filled with water. +(see TA3 Coal Power Station)]]), "techage:coalboiler_base") diff --git a/coal_power_station/boiler.lua b/coal_power_station/boiler_top.lua similarity index 79% rename from coal_power_station/boiler.lua rename to coal_power_station/boiler_top.lua index 74e8ec0..7b72c40 100644 --- a/coal_power_station/boiler.lua +++ b/coal_power_station/boiler_top.lua @@ -8,7 +8,7 @@ LGPLv2.1+ See LICENSE.txt for more information - TA3 Coal Power Station Boiler + TA3 Coal Power Station Boiler Top ]]-- @@ -62,6 +62,10 @@ local function formspec(self, pos, mem) default.get_hotbar_bg(0, 3) end +local function valid_power_dir(pos, power_dir, in_dir) + return power_dir == in_dir +end + local function start_node(pos, mem, state) generator.turn_power_on(pos, POWER_CAPACITY) end @@ -71,7 +75,7 @@ local function stop_node(pos, mem, state) end local State = techage.NodeStates:new({ - node_name_passive = "techage:coalboiler1", + node_name_passive = "techage:coalboiler_top", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, has_item_meter = false, @@ -216,72 +220,14 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return 0 end -minetest.register_node("techage:coalboiler2", { - - - paramtype2 = "facedir", - groups = {cracky=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:coalboiler1", { - description = I("TA3 Coal Power Station Firebox"), - inventory_image = "techage_coal_boiler_inv.png", - tiles = {"techage_coal_boiler_mesh.png"}, - drawtype = "mesh", - mesh = "techage_boiler_large.obj", - selection_box = { - type = "fixed", - fixed = {-14/32, -16/32, -14/32, 14/32, 16/32, 14/32}, - }, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - - on_timer = node_timer, - can_dig = can_dig, - allow_metadata_inventory_put = allow_metadata_inventory, - allow_metadata_inventory_take = allow_metadata_inventory, - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - - on_construct = function(pos) - local mem = tubelib2.init_mem(pos) - mem.running = false - mem.burn_cycles = 0 - local meta = M(pos) - meta:set_string("formspec", formspec(mem)) - local inv = meta:get_inventory() - inv:set_size('fuel', 1) - end, - - on_metadata_inventory_put = function(pos) - local mem = tubelib2.init_mem(pos) - mem.running = true - -- activate the formspec fire temporarily - mem.burn_cycles = BURN_CYCLES - M(pos):set_string("formspec", formspec(mem)) - mem.burn_cycles = 0 - swap_node(pos, "techage:firebox_on") - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - - --- boiler2: Main part, needed as generator -minetest.register_node("techage:boiler2", { +minetest.register_node("techage:coalboiler_top", { description = I("TA3 Boiler Top"), - tiles = {"techage_coal_boiler.png"}, + tiles = {"techage_coal_boiler_mesh_top.png"}, drawtype = "mesh", mesh = "techage_boiler_large.obj", selection_box = { type = "fixed", - fixed = {-10/32, -48/32, -10/32, 10/32, 16/32, 10/32}, + fixed = {-13/32, -48/32, -13/32, 13/32, 16/32, 13/32}, }, can_dig = can_dig, @@ -302,7 +248,8 @@ minetest.register_node("techage:boiler2", { minetest.get_node_timer(pos):start(CYCLE_TIME) end end, - power_side = "U", + power_side = "F", + valid_power_dir = valid_power_dir, }, on_construct = function(pos) @@ -315,7 +262,7 @@ minetest.register_node("techage:boiler2", { local mem = generator.after_place_node(pos) State:node_init(pos, mem, "") local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == "techage:boiler1" then + if node.name == "techage:coalboiler_base" then on_rightclick(pos) end end, @@ -331,10 +278,26 @@ minetest.register_node("techage:boiler2", { minetest.after(0.5, move_to_water, pos) end, - --paramtype2 = "facedir", + paramtype2 = "facedir", groups = {cracky=1}, on_rotate = screwdriver.disallow, is_ground_content = false, sounds = default.node_sound_metal_defaults(), }) +Pipe:add_secondary_node_names({"techage:coalboiler_top"}) + + +minetest.register_craft({ + output = "techage:coalboiler_top", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"techage:iron_ingot", "", "techage:iron_ingot"}, + {"default:stone", "", "default:stone"}, + }, +}) + +techage.register_help_page(I("TA3 Boiler Top"), +I([[Part of the Coal Power Station. +Has to be placed on top of TA3 Power Station Boiler Base. +(see TA3 Coal Power Station)]]), "techage:coalboiler_top") diff --git a/coal_power_station/firebox.lua b/coal_power_station/firebox.lua index 9a98560..ec0f530 100644 --- a/coal_power_station/firebox.lua +++ b/coal_power_station/firebox.lua @@ -176,3 +176,24 @@ minetest.register_node("techage:coalfirehole_on", { groups = {not_in_creative_inventory=1}, }) +minetest.register_craft({ + output = "techage:coalfirebox", + recipe = { + {'default:stone', 'default:stone', 'default:stone'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:stone', 'default:stone', 'default:stone'}, + }, +}) + +techage.register_node("techage:firebox", {"techage:firebox_on"}, { + on_push_item = function(pos, in_dir, stack) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:room_for_item("fuel", stack) then + inv:add_item("fuel", stack) + minetest.get_node_timer(pos):start(CYCLE_TIME) + return true + end + return false + end, +}) diff --git a/coal_power_station/generator.lua b/coal_power_station/generator.lua index 74bf475..16f6ed2 100644 --- a/coal_power_station/generator.lua +++ b/coal_power_station/generator.lua @@ -8,7 +8,7 @@ LGPLv2.1+ See LICENSE.txt for more information - TA2 Steam Engine Flywheel + TA3 Power Station Generator ]]-- @@ -26,9 +26,9 @@ local I,_ = dofile(MP.."/intllib.lua") local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 8 -local POWER_CAPACITY = 8 +local POWER_CAPACITY = 50 -local Axle = techage.Axle +local Cable = techage.ElectricCable local generator = techage.generator local function formspec(self, pos, mem) @@ -43,31 +43,51 @@ local function formspec(self, pos, mem) default.get_hotbar_bg(0, 3) end -local function start_cylinder(pos, on) +local function start_turbine(pos, on, mem) + if not on then + if mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end + end local pos2 = techage.get_pos(pos, 'L') local trd = TRD(pos2) - if trd and trd.start_cylinder then - return trd.start_cylinder(pos2, on) + if trd and trd.start_turbine then + return trd.start_turbine(pos2, on, mem) end return false end local function can_start(pos, mem, state) - return start_cylinder(pos, true) + return start_turbine(pos, true, mem) +end + +local function play_sound(pos) + local mem = tubelib2.get_mem(pos) + if mem.techage_state == techage.RUNNING then + mem.handle = minetest.sound_play("techage_turbine", { + pos = pos, + gain = 1, + max_hear_distance = 15}) + minetest.after(2, play_sound, pos) + end end local function start_node(pos, mem, state) generator.turn_power_on(pos, POWER_CAPACITY) + mem.techage_state = techage.RUNNING + play_sound(pos) end local function stop_node(pos, mem, state) - start_cylinder(pos, false) + mem.techage_state = techage.STOPPED + start_turbine(pos, false, mem) generator.turn_power_on(pos, 0) end local State = techage.NodeStates:new({ - node_name_passive = "techage:flywheel", - node_name_active = "techage:flywheel_on", + node_name_passive = "techage:generator", + node_name_active = "techage:generator_on", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, formspec_func = formspec, @@ -81,20 +101,19 @@ local function distibuting(pos, mem) State:keep_running(pos, mem, COUNTDOWN_TICKS) else State:fault(pos, mem) - start_cylinder(pos, false) + start_turbine(pos, false, mem) generator.turn_power_on(pos, 0) end end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - print("flywheel node_timer") local pos2 = techage.get_pos(pos, 'L') - if minetest.get_node(pos2).name == "techage:cylinder_on" and tubelib2.get_mem(pos2).running then + if minetest.get_node(pos2).name == "techage:turbine_on" and tubelib2.get_mem(pos2).running then distibuting(pos, mem) else State:fault(pos, mem) - start_cylinder(pos, false) + start_turbine(pos, false, mem) generator.turn_power_on(pos, 0) end return State:is_active(mem) @@ -110,7 +129,7 @@ local function turn_power_on(pos, in_dir, sum) mem.power_result = sum if State:is_active(mem) and sum <= 0 then State:fault(pos, mem) - start_cylinder(pos, false) + start_turbine(pos, false, mem) -- No automatic turn on mem.power_capacity = 0 end @@ -134,21 +153,22 @@ local function on_rightclick(pos) M(pos):set_string("formspec", formspec(State, pos, mem)) end -minetest.register_node("techage:flywheel", { - description = I("TA2 Flywheel"), +minetest.register_node("techage:generator", { + description = I("TA3 Generator"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_axle_clutch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png^[transformFX]", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png^[transformFX]", }, techage = { turn_on = turn_power_on, read_power_consumption = generator.read_power_consumption, - power_network = Axle, + power_network = Cable, + power_side = "R", animated_power_network = true, }, @@ -175,8 +195,8 @@ minetest.register_node("techage:flywheel", { sounds = default.node_sound_wood_defaults(), }) -minetest.register_node("techage:flywheel_on", { - description = I("TA2 Flywheel"), +minetest.register_node("techage:generator_on", { + description = I("TA3 Generator"), tiles = { -- up, down, right, left, back, front "techage_filling_ta2.png^techage_frame_ta2.png", @@ -216,7 +236,8 @@ minetest.register_node("techage:flywheel_on", { techage = { turn_on = turn_power_on, read_power_consumption = generator.read_power_consumption, - power_network = Axle, + power_network = Cable, + power_side = "R", animated_power_network = true, }, @@ -237,3 +258,30 @@ minetest.register_node("techage:flywheel_on", { is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) + +minetest.register_craft({ + output = "techage:generator", + recipe = { + {"basic_materials:steel_bar", "dye:red", "default:wood"}, + {"", "basic_materials:gear_steel", "techage:axle"}, + {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, + }, +}) + +minetest.register_lbm({ + label = "[techage] Generator sound", + name = "techage:power_station", + nodenames = {"techage:generator_on"}, + run_at_every_load = true, + action = function(pos, node) + play_sound(pos) + end +}) + +techage.register_help_page(I("TA3 Generator"), +I([[Part of the Coal Power Station. +Has to be placed side by side +with the TA3 Turbine. +Connect the Generator with your TA3 machines +by means of Electric Cables and Junction Boxes +(see TA3 Coal Power Station)]]), "techage:generator") \ No newline at end of file diff --git a/coal_power_station/turbine.lua b/coal_power_station/turbine.lua index 72e0334..e95b9fc 100644 --- a/coal_power_station/turbine.lua +++ b/coal_power_station/turbine.lua @@ -8,7 +8,7 @@ LGPLv2.1+ See LICENSE.txt for more information - TA2 Steam Engine Cylinder + TA3 Power Station Turbine ]]-- @@ -52,26 +52,26 @@ local function start_cylinder(pos, on) local mem = tubelib2.get_mem(pos) if on and mem.running then consumer.turn_power_on(pos, POWER_CONSUMPTION) - swap_node(pos, "techage:cylinder_on") + swap_node(pos, "techage:turbine_on") return true else consumer.turn_power_on(pos, 0) - swap_node(pos, "techage:cylinder") + swap_node(pos, "techage:turbine") end return false end -minetest.register_node("techage:cylinder", { - description = I("TA2 Cylinder"), +minetest.register_node("techage:turbine", { + description = I("TA3 Turbine"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_steam_hole.png", - "techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", + "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", }, techage = { turn_on = turn_power_on_clbk, @@ -98,14 +98,14 @@ minetest.register_node("techage:cylinder", { sounds = default.node_sound_wood_defaults(), }) -minetest.register_node("techage:cylinder_on", { - description = I("TA2 Cylinder"), +minetest.register_node("techage:turbine_on", { + description = I("TA3 Turbine"), tiles = { -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_steam_hole.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", + "techage_filling_ta3.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", + "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", { image = "techage_filling4_ta2.png^techage_cylinder4.png^techage_frame4_ta2.png", backface_culling = false, @@ -147,3 +147,17 @@ minetest.register_node("techage:cylinder_on", { sounds = default.node_sound_wood_defaults(), }) +minetest.register_craft({ + output = "techage:turbine", + recipe = { + {"basic_materials:steel_bar", "techage:iron_ingot", "default:wood"}, + {"techage:steam_pipeS", "basic_materials:gear_steel", ""}, + {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, + }, +}) + +techage.register_help_page(I("TA3 Turbine"), +I([[Part of the Coal Power Station. +Has to be placed side by side +with the TA3 Generator. +(see TA3 Coal Power Station)]]), "techage:turbine") diff --git a/init.lua b/init.lua index 301545d..194e8f3 100644 --- a/init.lua +++ b/init.lua @@ -87,16 +87,17 @@ else end -- Coal power station - dofile(MP.."/coal_power_station/firebox.lua") - --dofile(MP.."/coal_power_station/boiler.lua") + --dofile(MP.."/coal_power_station/firebox.lua") + --dofile(MP.."/coal_power_station/boiler_base.lua") + --dofile(MP.."/coal_power_station/boiler_top.lua") --dofile(MP.."/coal_power_station/generator.lua") --dofile(MP.."/coal_power_station/turbine.lua") --dofile(MP.."/coal_power_station/cooler.lua") - dofile(MP.."/test/battery.lua") + --dofile(MP.."/test/battery.lua") --dofile(MP.."/test/test.lua") - dofile(MP.."/test/generator.lua") + --dofile(MP.."/test/generator.lua") --dofile(MP.."/test/consumer.lua") --dofile(MP.."/test/consumer2.lua") diff --git a/sounds/techage_turbine.ogg b/sounds/techage_turbine.ogg new file mode 100644 index 0000000000000000000000000000000000000000..99c1214d3a51172aea05a84a4168a2de4cf7a3e7 GIT binary patch literal 15804 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 G!2bZbYErEL literal 0 HcmV?d00001 diff --git a/steam_engine/boiler.lua b/steam_engine/boiler.lua index 6de5504..517e0b6 100644 --- a/steam_engine/boiler.lua +++ b/steam_engine/boiler.lua @@ -292,6 +292,7 @@ minetest.register_node("techage:boiler2", { end, --paramtype2 = "facedir", + drop = "", groups = {cracky=1}, on_rotate = screwdriver.disallow, is_ground_content = false, diff --git a/steam_engine/flywheel.lua b/steam_engine/flywheel.lua index 43abfdc..6e96697 100644 --- a/steam_engine/flywheel.lua +++ b/steam_engine/flywheel.lua @@ -188,6 +188,7 @@ minetest.register_node("techage:flywheel", { on_rightclick = on_rightclick, on_timer = node_timer, + drop = "", paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -251,6 +252,7 @@ minetest.register_node("techage:flywheel_on", { on_rightclick = on_rightclick, on_timer = node_timer, + drop = "", paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, diff --git a/steam_engine/help.lua b/steam_engine/help.lua index f595ab5..8fb0cb3 100644 --- a/steam_engine/help.lua +++ b/steam_engine/help.lua @@ -25,7 +25,7 @@ local HelpText = S([[1. Build a steam machine according to the plan with TA2 Firebox, TA2 Boiler, Steam Pipes, TA2 Cyclinder and TA2 Flywheel. 2. Heat the Firebox with coal/charcoal -3. Fill the boiler with water (more than on bucket is needed) +3. Fill the boiler with water (more than one bucket is needed) 4. Wait until the water is heated 5. Open the steam ventil 6. Start the Flywheel diff --git a/test/generator.lua b/test/generator.lua index 20303e4..5b59bab 100644 --- a/test/generator.lua +++ b/test/generator.lua @@ -12,7 +12,8 @@ local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 16 local POWER_CAPACITY = 8 -local Cable = techage.ElectricCable +--local Power = techage.ElectricCable +local Power = techage.SteamPipe local generator = techage.generator local function formspec(self, pos, mem) @@ -99,7 +100,7 @@ minetest.register_node("techage:generator", { techage = { turn_on = turn_power_on, read_power_consumption = generator.read_power_consumption, - power_network = Cable, + power_network = Power, power_side = "R", }, @@ -120,3 +121,4 @@ minetest.register_node("techage:generator", { on_timer = node_timer, }) +Power:add_secondary_node_names({"techage:generator"}) diff --git a/textures/techage_appl_generator.png b/textures/techage_appl_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..39263fa9a94d2ff93512084c3fde5a8f3ade8c1c GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pI^l~sg+EwD@|oPmMS#M8wwB;s&#f&{CwtidAgoEy9T z*{^JCIXlO5%dPm?WeaYcZ1N3kC|6L{E{n6#22h$KJx8d>t^fSyE`u(c3OQTG%m_(CbLx8*+2D_|1}r!+^qSkdF{ti3zibu zvmHh**C$qROPjq_xW{;;jbS6h>~;g04R8Ntwr$Z2{qM=i=*4hOprYup-Ql~Nudm3O zxoM+VBKw}I4?T@Q;OOGVw3=;KD+4q0;R7uPc8jlU)?H4HT^pFCio7M5_ApE4F5dGm z`Le_H7y|`G2M^}6jF!GeUT4yhBoYi>F^E+yZw@rzy1>ZrXJ$hGk=n1HfI-UO>FVdQ I&MBb@0IC0{t^fc4 literal 0 HcmV?d00001 diff --git a/textures/techage_appl_turbine.png b/textures/techage_appl_turbine.png new file mode 100644 index 0000000000000000000000000000000000000000..323e4a4f737dc3f39e02f274d3400766c50050da GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&pI^l~q`n+dJLzF9QRkx~Gd{NW|gf1PNAUS%XWb67{{Ako*X@`}>w(Sb=Q|c+9>;m$|xV@LpW&`{T3v{R`kMk77=%T2EbPp0mjgqQ!PC{xWt~$(69DU& Bq7MK7 literal 0 HcmV?d00001 diff --git a/textures/techage_appl_turbine4.png b/textures/techage_appl_turbine4.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3070da056fa3c01e1ac3937a827283502a0fb6 GIT binary patch literal 751 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!3HF=(z2z16kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_%*rY(!N2~WiarAaQ;nyKV@SoVw^6qKOpXGv7G6#| zAy!F$bUHR(II=)gWs<`pGc&PE(ZAUL{Ll`#5s}H%**fi*mx++4jo`#N5>vu99z3R8 z{#ti?_ilkl)hC~*RoX;vrBXBYPII37iU)ey}mat zlHeFmii+O{UnXI0h(xJYYj2~>A=lQ(v zI{Hp@f$`$Vwq#+cy#}VH+xPF2Qhr!4gNK!A-J7c>MwWK>o?T41aLjw6$L&}7@=xOS z+dcRtI%DRJkMR#B9A3Wkl#2Gvkk^=gI%tPBtDLuLW{#;ME6?EvNviJ;gxZ}y+m?7^ z#=bn$cMOv{MOKE*_Ibw=m|By^%KZ4kM6r$!nKRBVwN0C#bjrh?H*;yl)W9(Q3#YEU z{`xP(CGUN}`K&`}#s(6pmcRi1#r%SQfqlb2EDT_bZSqaj-uH5cV5%Sg)$i;+&(oi~ zZ~Gcivba3`;5oll_U(e+RZkgnj+#g7yqp^1;x}{NT=|KUA17~RjF6qp7k>R(i>xv8 zgUU9WnXh);+sjmvW^%gV%p3kQzGvPY51)4O%NZWdAAiBYA;z_}vLfZkG49WwbF)qC zPM$ri8()9m%#q%yf6Ui}tiE(3%jx%l&*$0yow}sMUoVCzUS<&?xwv zy*4fR*RHEOm^)m}Pny(LgQkT3wYAs$P zw_s{zzR9m(!JT`ZZC7*dpY`vc#%V?d1_S$spNwbt6Y3Z~GtZDe@Q2|UJ3@$IA7k~> WO&mKaGlhU5$KdJe=d#Wzp$Pze$xC$r literal 0 HcmV?d00001 diff --git a/textures/techage_coal_boiler_mesh.png b/textures/techage_coal_boiler_mesh.png index 46373a44ebb8ed862dd7c34e3bc484aab09000b7..8d4651dccef73b0bfcdf2c6e74e0f07ba0dbdf29 100644 GIT binary patch delta 1290 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 literal 0 HcmV?d00001 diff --git a/textures/techage_coal_boiler_mesh_top.png b/textures/techage_coal_boiler_mesh_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4651dccef73b0bfcdf2c6e74e0f07ba0dbdf29 GIT binary patch literal 1400 zcmV-;1&8{HP)Px#9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN010qNS#tmY3ljhU3ljkVnw%H_000$GOjJe0!LiKBz17mk0002q-P5wJ zp0jf;vK2*I000ETNkl7zSYpvsb=SH+F zC)xDb!suHW<{TF^#JU1KyA zsw28nii@sr+5$&Z?59x*etjN>dex6sI(D_rPkJz)F(9#S8>MyEfn=s+0<*!A*E^Bm_mwU zZSGR{mgb<00p&~wXXzVODTV#2)hgfjai&r86@%rT=*&rS3WTqYHE}<92^{$Q_wQn+ z`%R(9odiv(7IvFNsjXB0c>R|yOg3*9*F;7#MP*nf_EDV{0GKp{Wj!ga&pug0h^1~) zhmGX~z}A)0eTG#q4We)pozCFGg=>3C5Z~vbJr%_zDO`JJsU&&MI2{04v8A@^{Q=Zy z3#Aki*E!<#0Im?{(Z-Ce=SY=@%G`sXxiR8In;E=C8dRE8rg5#jwguoc`VuNs2 zZ4q^(He6(sIk4-H7OpGfFt~@;ccsOQIOr5FVF+^|3|U%R=up*6jw#(sN-k5`<-)nP z>X}smxM^7ZLAWfB!-#6)Gq1IJ1%S8)YA&8(K<<-vQW#HbIN&s83~J`c>TW(@3y7Cy zC5<};fg_y?+|H3_>J|Q){`e4QTifEC1-=kl(<=O~iuETQK!@3UcRf=OHiEr6F2$8Y zPpKO)1zG?OTFC`nSV+0EMtBK*vpbJAA4Ki$u=*`y_UvjIy0H-;WJcD^K4HhU3oWE~ zw%0eaHz{%11ryJ)N*Qr~)Va{IzMkK=&Y98L7-?uIi>A`H4WgF%>kq(-z%;xE)h!h) z?zeW$k1u|I{q?(pWP}lZ(M`X90?b91Y^~~15xiyU|Cdk;ErsFR%@BowiGR)EtDXp-APDS(cs70W zN#z6ZpIEZmp3uuu@5u`n{}ze`VeW00-XKl;=V z;fs;wM{=AhvEu~(c?E%cy9}fU!R$!SfOu#>0bgUDVbqb>bvpI>hIVN4el^Mo z2u?vehG0X8_4wB?9Rax_De8e2`A7#^!s_#G`u}d=7*L8-BBqIlsJ6+7Z%Xz&=dUmD zS(}RY5g`DBE{t!wV7=wXn;7>b@H!kno