diff --git a/doc/items.lua b/doc/items.lua index c5f2494..96e27ca 100644 --- a/doc/items.lua +++ b/doc/items.lua @@ -105,5 +105,11 @@ techage.Items = { ta4_turbine = "techage:ta4_turbine", ta4_generator = "techage:ta4_generator", ta4_heatexchanger = "techage:heatexchanger3", + ta4_powercable = "techage:ta4_power_cableS", + ta4_powerbox = "techage:ta4_power_box", + ta4_solarmodule = "techage:ta4_solar_module", + ta4_solarcarrier = "techage:ta4_solar_carrier", + ta4_solar_inverter = "techage:ta4_solar_inverter", + techage_ta4_solar = "techage_ta4_solar.png", --ta4_ "", } diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 43a0d91..54f074a 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -99,6 +99,11 @@ techage.manual_DE.aTitel = { "3,TA4 Wind Turbine Signal Lamp", "3,TA4 Säule / Pillar", "2,Solaranlage", + "3,TA4 Solarmodul / Solar Module", + "3,TA4 Solar Trägermodul / Carrier Module", + "3,TA4 Solar Wechselrichter / Solar Inverter", + "3,TA4 Niederspannungskabel / Low Power Cable", + "3,TA4 Niederspannungsverteilerbox / Low Power Box", "3,TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell", "2,Biogasanlage", "2,Energiespeicher", @@ -783,11 +788,58 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "Diese glänzt noch durch Abwesenheit.\n".. - "Aber es gibt schon die...\n".. + "Die Solaranlage produziert nur Strom\\, wenn die Sonne scheint. Im Spiel ist das jeder Spieltag von morgens 6:00 bis abends 18:00.\n".. + "In dieser Zeit steht immer die gleiche Leistung zur Verfügung. Nach 18:00 schalten die Solarmodule komplett ab.\n".. + "\n".. + "Für die Leistung der Solarmodule ist die Biome Temperatur entscheidend. Je heißer die Temperatur\\, um so höher der Ertrag.\n".. + "Die Biome Temperatur kann mit dem Techage Info Tool (Schraubenschlüssel) bestimmt werden. Sie schwankt typischerweise zwischen 0 und 100:\n".. + "\n".. + " - bei 100 steht die volle Leistung zur Verfügung\n".. + " - bei 50 steht die halbe Leistung zur Verfügung\n".. + " - bei 0 steht keine Leistung zur Verfügung\n".. + "\n".. + "Es empfiehlt sich daher\\, nach heißen Steppen und Wüsten für die Solaranlage Ausschau zu halten.\n".. + "Für den Stromtransport stehen die Überlandleitungen zur Verfügung.\n".. + "Es kann aber auch Wasserstoff produziert werden\\, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt (geplant).\n".. + "\n".. + "Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden\\, die zwei Solarmodule dann links und rechts daneben.\n".. + "\n".. + "Solarmodule liefern Gleichspannung\\, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser hat zwei Anschlussseiten\\, eine für das rote Kabel zu den Solarmodulen und eine für das graue Stromkabel ins Stromnetz.\n".. + "\n".. + "Der Kartenbereich\\, wo die Solaranlage steht\\, muss komplett geladen sein. Es empfiehlt sich daher\\, zuerst einen Forceload Block zu setzen\\, und dann innerhalb dieses Bereiches die Module zu platzieren.\n".. + "\n".. + "\n".. + "\n", + "Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig.\n".. + "Im Paar leisten die Solarmodule bis 4 ku\\, je nach Temperatur.\n".. + "Bei den Solarmodul muss darauf geachtet werden\\, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind.\n".. + "\n".. + "\n".. + "\n", + "Das Trägermodul gibt es in zwei Bauhöhen (1m und 2m). Funktionell sind beide identisch.\n".. + "Die Trägermodule können direkt aneinander gesetzt und so zu einer Modulreihe verbunden werden. Die Verbindung zum Wechselrichter oder zu anderen Modulreihen muss mit den roten Niederspannungskabeln bzw. den Niederspannungsverteilerboxen hergestellt werden.\n".. + "\n".. + "\n".. + "\n", + "Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um\\, so dass dieser in das Stromnetz eingespeist werden kann.\n".. + "Ein Wechselrichter kann maximal 120 ku an Strom einspeisen\\, was 30 Solarmodulen oder auch mehr entspricht.\n".. + "\n".. + "\n".. + "\n", + "Das Niederspannungskabel dient zur Verbindung von Solar-Modulreihen mit dem Wechselrichter. Das Kabel darf nicht für andere Zwecke benutzt werden.\n".. + "\n".. + "Die maximale Leitungslänge beträgt 200 m.\n".. + "\n".. + "\n".. + "\n", + "Die Verteilerbox muss auf den Boden gesetzt werden. Sie besitzt nur 4 Anschlüsse (in die 4 Himmelsrichtungen).\n".. + "\n".. + "\n".. "\n", "Die Straßenlampen-Solarzelle dient\\, wie der Name schon sagt\\, zur Stromversorgung einer Straßenlampe. Dabei kann eine Solarzelle zwei Lampen versorgen. Die Solarzelle speichert die Sonnenenergie tagsüber und gibt den Strom Nachts an die Lampe ab. Das bedeutet\\, die Lampe leuchtet nur im Dunkeln.\n".. "\n".. + "Diese Solarzelle kann nicht mit den anderen Solarmodulen kombiniert werden.\n".. + "\n".. "\n".. "\n", "noch nicht vorhanden...\n".. @@ -928,7 +980,12 @@ techage.manual_DE.aItemName = { "ta4_nacelle", "ta4_blinklamp", "ta4_pillar", - "", + "techage_ta4_solar", + "ta4_solarmodule", + "ta4_solarcarrier", + "ta4_solar_inverter", + "ta4_powercable", + "ta4_powerbox", "ta4_minicell", "", "", @@ -1039,6 +1096,11 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", + "", + "", + "", + "", "ta4_storagesystem", "", "", diff --git a/i18n.py b/i18n.py index e91fe80..ab2b9b5 100755 --- a/i18n.py +++ b/i18n.py @@ -8,6 +8,7 @@ # # Copy the script into the mod root folder and adapt the last code lines to you needs. +from __future__ import print_function import os, fnmatch, re, shutil pattern_lua = re.compile(r'[ \.=^\t]S\("(.+?)"\)', re.DOTALL) diff --git a/images/solar_plant.png b/images/solar_plant.png new file mode 100644 index 0000000..53dc02f Binary files /dev/null and b/images/solar_plant.png differ diff --git a/init.lua b/init.lua index 9a932e8..695775d 100644 --- a/init.lua +++ b/init.lua @@ -22,7 +22,7 @@ else -- Debugging via "techage.Debug.dbg(text)" techage.Debug = { dbg = function(text, ...) - local t = string.format("%.4f %4s: ", minetest.get_us_time() / 1000000.0, topic) + local t = string.format("%.4f: ", minetest.get_us_time() / 1000000.0) if type(text) ~= "string" then text = dump(text) end @@ -34,6 +34,7 @@ else --dbg2 = true, --tst = true, --bot = true -- Signs Bot + --slr = true, } -- Basis features @@ -71,6 +72,7 @@ else dofile(MP.."/power/protection.lua") dofile(MP.."/power/ta4_pipe.lua") dofile(MP.."/power/ta4_junction.lua") + dofile(MP.."/power/ta4_cable.lua") -- Iron Age dofile(MP.."/iron_age/main.lua") @@ -183,6 +185,8 @@ else -- Solar dofile(MP.."/nodes/silicon.lua") dofile(MP.."/solar/minicell.lua") + dofile(MP.."/solar/solarcell.lua") + dofile(MP.."/solar/inverter.lua") -- Wind dofile(MP.."/wind_turbine/rotor.lua") diff --git a/locale/techage.de.tr b/locale/techage.de.tr index e9fc48d..5ec61dd 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -162,12 +162,19 @@ TA4 Heat Exchanger 1=TA4 Wärmetauscher 1 TA4 Heat Exchanger 2=TA4 Wärmetauscher 2 TA4 Heat Exchanger 3=TA4 Wärmetauscher 3 TA4 Junction Pipe=TA4 Verbindungsrohr +TA4 Low Power Box==TA4 Niederspannungsverteilerbox +TA4 Low Power Cable=TA4 Niederspannungskabel TA4 Pillar=TA4 Säule TA4 Pipe=TA4 Röhre TA4 Pipe Inlet=TA4 Rohrzulauf TA4 Protected Chest=TA4 Gesicherte Kiste TA4 Rotor Blade=TA4 Rotorblatt TA4 Silicon Wafer=TA4 Silizium-Wafer +TA4 Solar Carrier Module=TA4 Solar Trägermodul +TA4 Solar Carrier Module B=TA4 Solar Trägermodul U +TA4 Solar Carrier Module T=TA4 Solar Trägermodul O +TA4 Solar Inverter=TA4 Solar Wechselrichter +TA4 Solar Module=TA4 Solarmodul TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle TA4 Turbine=TA4 Turbine TA4 WLAN Chip=TA4 WLAN Chip diff --git a/locale/template.txt b/locale/template.txt index 86d42dc..419c867 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -160,12 +160,19 @@ TA4 Heat Exchanger 1= TA4 Heat Exchanger 2= TA4 Heat Exchanger 3= TA4 Junction Pipe= +TA4 Low Power Box= +TA4 Low Power Cable= TA4 Pillar= TA4 Pipe= TA4 Pipe Inlet= TA4 Protected Chest= TA4 Rotor Blade= TA4 Silicon Wafer= +TA4 Solar Carrier Module= +TA4 Solar Carrier Module B= +TA4 Solar Carrier Module T= +TA4 Solar Inverter= +TA4 Solar Module= TA4 Streetlamp Solar Cell= TA4 Turbine= TA4 WLAN Chip= diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 8e8d0a0..99b3c24 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -50,13 +50,75 @@ Damit wird der Mast für die Windkraftanlage gebaut. Allerdings werden diese Bl ## Solaranlage -Diese glänzt noch durch Abwesenheit. -Aber es gibt schon die... +Die Solaranlage produziert nur Strom, wenn die Sonne scheint. Im Spiel ist das jeder Spieltag von morgens 6:00 bis abends 18:00. +In dieser Zeit steht immer die gleiche Leistung zur Verfügung. Nach 18:00 schalten die Solarmodule komplett ab. + +Für die Leistung der Solarmodule ist die Biome Temperatur entscheidend. Je heißer die Temperatur, um so höher der Ertrag. +Die Biome Temperatur kann mit dem Techage Info Tool (Schraubenschlüssel) bestimmt werden. Sie schwankt typischerweise zwischen 0 und 100: +- bei 100 steht die volle Leistung zur Verfügung +- bei 50 steht die halbe Leistung zur Verfügung +- bei 0 steht keine Leistung zur Verfügung + +Es empfiehlt sich daher, nach heißen Steppen und Wüsten für die Solaranlage Ausschau zu halten. +Für den Stromtransport stehen die Überlandleitungen zur Verfügung. +Es kann aber auch Wasserstoff produziert werden, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt (geplant). + +Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden, die zwei Solarmodule dann links und rechts daneben. + +Solarmodule liefern Gleichspannung, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser hat zwei Anschlussseiten, eine für das rote Kabel zu den Solarmodulen und eine für das graue Stromkabel ins Stromnetz. + +Der Kartenbereich, wo die Solaranlage steht, muss komplett geladen sein. Es empfiehlt sich daher, zuerst einen Forceload Block zu setzen, und dann innerhalb dieses Bereiches die Module zu platzieren. + +[techage_ta4_solar|image] + + +### TA4 Solarmodul / Solar Module + +Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig. +Im Paar leisten die Solarmodule bis 4 ku, je nach Temperatur. +Bei den Solarmodul muss darauf geachtet werden, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind. + +[ta4_solarmodule|image] + + +### TA4 Solar Trägermodul / Carrier Module + +Das Trägermodul gibt es in zwei Bauhöhen (1m und 2m). Funktionell sind beide identisch. +Die Trägermodule können direkt aneinander gesetzt und so zu einer Modulreihe verbunden werden. Die Verbindung zum Wechselrichter oder zu anderen Modulreihen muss mit den roten Niederspannungskabeln bzw. den Niederspannungsverteilerboxen hergestellt werden. + +[ta4_solarcarrier|image] + + +### TA4 Solar Wechselrichter / Solar Inverter + +Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um, so dass dieser in das Stromnetz eingespeist werden kann. +Ein Wechselrichter kann maximal 120 ku an Strom einspeisen, was 30 Solarmodulen oder auch mehr entspricht. + +[ta4_solar_inverter|image] + + +### TA4 Niederspannungskabel / Low Power Cable + +Das Niederspannungskabel dient zur Verbindung von Solar-Modulreihen mit dem Wechselrichter. Das Kabel darf nicht für andere Zwecke benutzt werden. + +Die maximale Leitungslänge beträgt 200 m. + +[ta4_powercable|image] + + +### TA4 Niederspannungsverteilerbox / Low Power Box + +Die Verteilerbox muss auf den Boden gesetzt werden. Sie besitzt nur 4 Anschlüsse (in die 4 Himmelsrichtungen). + +[ta4_powerbox|image] + ### TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell Die Straßenlampen-Solarzelle dient, wie der Name schon sagt, zur Stromversorgung einer Straßenlampe. Dabei kann eine Solarzelle zwei Lampen versorgen. Die Solarzelle speichert die Sonnenenergie tagsüber und gibt den Strom Nachts an die Lampe ab. Das bedeutet, die Lampe leuchtet nur im Dunkeln. +Diese Solarzelle kann nicht mit den anderen Solarmodulen kombiniert werden. + [ta4_minicell|image] diff --git a/manuals/toc_DE.md b/manuals/toc_DE.md index 944f77c..c97e96d 100644 --- a/manuals/toc_DE.md +++ b/manuals/toc_DE.md @@ -98,6 +98,11 @@ - [TA4 Wind Turbine Signal Lamp](./manual_ta4_DE.md#ta4-wind-turbine-signal-lamp) - [TA4 Säule / Pillar](./manual_ta4_DE.md#ta4-säule--pillar) - [Solaranlage](./manual_ta4_DE.md#solaranlage) + - [TA4 Solarmodul / Solar Module](./manual_ta4_DE.md#ta4-solarmodul--solar-module) + - [TA4 Solar Trägermodul / Carrier Module](./manual_ta4_DE.md#ta4-solar-trägermodul--carrier-module) + - [TA4 Solar Wechselrichter / Solar Inverter](./manual_ta4_DE.md#ta4-solar-wechselrichter--solar-inverter) + - [TA4 Niederspannungskabel / Low Power Cable](./manual_ta4_DE.md#ta4-niederspannungskabel--low-power-cable) + - [TA4 Niederspannungsverteilerbox / Low Power Box](./manual_ta4_DE.md#ta4-niederspannungsverteilerbox--low-power-box) - [TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell](./manual_ta4_DE.md#ta4-straßenlampen-solarzelle--streetlamp-solar-cell) - [Biogasanlage](./manual_ta4_DE.md#biogasanlage) - [Energiespeicher](./manual_ta4_DE.md#energiespeicher) diff --git a/power/power.lua b/power/power.lua index 77c77ea..e1e85ad 100644 --- a/power/power.lua +++ b/power/power.lua @@ -565,4 +565,22 @@ function techage.power.secondary_alive(pos, mem, capa_curr, capa_max) power_distribution(pos, mem, 1) end return mem.pwr_provided or 0 -end \ No newline at end of file +end + +-- +-- Read the current power value from all connected devices (used for solar cells) +-- +function techage.power.get_power(start_pos) + Route = {} + NumNodes = 0 + pos_already_reached(start_pos) + local sum = 0 + connection_walk(start_pos, function(pos, mem) + local pwr = PWR(pos) + if pwr and pwr.on_getpower then + sum = sum + pwr.on_getpower(pos, mem) + end + end) + return sum +end + diff --git a/power/power2.lua b/power/power2.lua index 2670680..724cf32 100644 --- a/power/power2.lua +++ b/power/power2.lua @@ -44,6 +44,7 @@ local function set_conn_dirs(pos, sides) M(pos):set_string("power_dirs", minetest.serialize(tbl)) end +techage.power.side_to_dir = side_to_dir techage.power.set_conn_dirs = set_conn_dirs local function valid_indir(pos, in_dir) @@ -100,6 +101,7 @@ function techage.power.register_node(names, pwr_def) conn_sides = pwr_def.conn_sides or {"L", "R", "U", "D", "F", "B"}, on_power = pwr_def.on_power, on_nopower = pwr_def.on_nopower, + on_getpower = pwr_def.on_getpower, power_network = pwr_def.power_network, after_place_node = ndef.after_place_node, after_dig_node = ndef.after_dig_node, @@ -187,6 +189,9 @@ function techage.power.formspec_load_bar(charging, max_val) end function techage.power.formspec_power_bar(max_power, current_power) + if (current_power or 0) == 0 then + return "techage_form_level_bg.png" + end local percent = techage.power.percent(max_power, current_power) percent = (percent + 5) / 1.22 -- texture correction return "techage_form_level_bg.png^[lowpart:"..percent..":techage_form_level_fg.png" diff --git a/power/ta4_cable.lua b/power/ta4_cable.lua new file mode 100644 index 0000000..57df374 --- /dev/null +++ b/power/ta4_cable.lua @@ -0,0 +1,170 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL 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 Cable = tubelib2.Tube:new({ + dirs_to_check = {1,2,3,4,5,6}, + max_tube_length = 200, + show_infotext = false, + tube_type = "ta4_power_cable", + primary_node_names = {"techage:ta4_power_cableS", "techage:ta4_power_cableA"}, + secondary_node_names = {}, + after_place_tube = function(pos, param2, tube_type, num_tubes) + minetest.swap_node(pos, {name = "techage:ta4_power_cable"..tube_type, param2 = param2}) + end, +}) + +Cable:register_on_tube_update(function(node, pos, out_dir, peer_pos, peer_in_dir) + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.after_tube_update then + minetest.registered_nodes[node.name].after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) + end +end) + +techage.TA4_Cable = Cable + +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", + 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", + 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, -4/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"}, + + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=2, crumbly=2, choppy=2}, + sounds = default.node_sound_defaults(), +}) + +techage.power.register_node({"techage:ta4_power_box"}, { + power_network = Cable, + conn_sides ={"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"}, + },}) diff --git a/solar/inverter.lua b/solar/inverter.lua new file mode 100644 index 0000000..8782b77 --- /dev/null +++ b/solar/inverter.lua @@ -0,0 +1,183 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Solar Power DC/AC Inverter + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos + +local Power = techage.ElectricCable +local Solar = techage.TA4_Cable +local power = techage.power + +local CYCLE_TIME = 2 +local PWR_PERF = 120 + +local function formspec(self, pos, mem) + local max_power = mem.max_power or 0 + local delivered = mem.delivered or 0 + local bar_in = techage.power.formspec_power_bar(max_power, max_power) + local bar_out = techage.power.formspec_power_bar(max_power, delivered) + return "size[5,3]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0.2,0;DC]".. + "image[0,0.5;1,2;"..bar_in.."]".. + "label[0,2.5;"..max_power.." ku]".. + "button[1.1,1;1.8,1;update;"..S("Update").."]".. + "image_button[3,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. + "label[4.2,0;AC]".. + "image[4,0.5;1,2;"..bar_out.."]".. + "label[4,2.5;"..delivered.." ku]" +end + +local function determine_power(pos, mem) + local time = minetest.get_timeofday() or 0 + if time < 6.00/24.00 or time > 18.00/24.00 then + mem.ticks = 0 + mem.max_power = 0 + return + end + if (mem.ticks % 20) == 0 then -- calculate max_power not to often + local dir = M(pos):get_int("left_dir") + -- We have to use get_connected_node_pos, because the inverter has already + -- a AC power connection. An additional DC power connection is not possibe, + -- so we have to start the connection_walk on the next node. + local pos1 = Solar:get_connected_node_pos(pos, dir) + mem.max_power = math.min(PWR_PERF, power.get_power(pos1)) + else + mem.max_power = mem.max_power or 0 + end + mem.ticks = mem.ticks + 1 +end + +local function can_start(pos, mem, state) + determine_power(pos, mem) + return mem.max_power > 0 +end + +local function start_node(pos, mem, state) + mem.running = true + mem.delivered = 0 + mem.ticks = 0 + power.generator_start(pos, mem, mem.max_power) +end + +local function stop_node(pos, mem, state) + mem.running = false + mem.delivered = 0 + power.generator_stop(pos, mem) +end + +local State = techage.NodeStates:new({ + node_name_passive = "techage:ta4_solar_inverter", + cycle_time = CYCLE_TIME, + standby_ticks = 0, + formspec_func = formspec, + infotext_name = S("TA4 Solar Inverter"), + can_start = can_start, + start_node = start_node, + stop_node = stop_node, +}) + +local function node_timer(pos, elapsed) + local mem = tubelib2.get_mem(pos) + if mem.running then + determine_power(pos, mem) + if mem.max_power > 0 then + mem.delivered = power.generator_alive(pos, mem) + else + mem.delivered = 0 + end + end + return mem.running +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local mem = tubelib2.get_mem(pos) + State:state_button_event(pos, mem, fields) + + if fields.update then + M(pos):set_string("formspec", formspec(State, pos, mem)) + end +end + +local function on_rightclick(pos) + local mem = tubelib2.get_mem(pos) + M(pos):set_string("formspec", formspec(State, pos, mem)) +end + +minetest.register_node("techage:ta4_solar_inverter", { + description = S("TA4 Solar Inverter"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", + }, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + on_rotate = screwdriver.disallow, + is_ground_content = false, + + after_place_node = function(pos, placer) + local mem = tubelib2.init_mem(pos) + local number = techage.add_node(pos, "techage:ta4_solar_inverter") + mem.running = false + mem.delivered = 0 + State:node_init(pos, mem, number) + local meta = M(pos) + -- Solar/low power cable direction + meta:set_int("left_dir", techage.power.side_to_outdir(pos, "L")) + meta:set_string("formspec", formspec(State, pos, mem)) + end, + + on_receive_fields = on_receive_fields, + on_rightclick = on_rightclick, + on_timer = node_timer, +}) + +techage.power.register_node({"techage:ta4_solar_inverter"}, { + conn_sides = {"R"}, + power_network = Power, +}) + +Solar:add_secondary_node_names({"techage:ta4_solar_inverter"}) + +techage.register_node({"techage:ta4_solar_inverter"}, { + on_recv_message = function(pos, src, topic, payload) + return State:on_receive_message(pos, topic, payload) + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, +}) + +minetest.register_craft({ + output = "techage:ta4_solar_inverter", + recipe = { + {'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, + {'techage:ta4_power_cableS', 'techage:ta4_wlanchip', 'techage:electric_cableS'}, + {'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'}, + }, +}) + diff --git a/solar/solarcell.lua b/solar/solarcell.lua new file mode 100644 index 0000000..dc052da --- /dev/null +++ b/solar/solarcell.lua @@ -0,0 +1,240 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019 Joachim Stolberg + + GPL v3 + See LICENSE.txt for more information + + TA4 Solar Module and Carriers + +]]-- + +-- for lazy programmers +local P = minetest.string_to_pos +local M = minetest.get_meta +local S = techage.S + +local PWR_PERF = 4 + +local Cable = techage.TA4_Cable +local power = techage.power + +local function temperature(pos) + local data = minetest.get_biome_data(pos) + if data then + return math.floor(data.heat) or 0 + end + return 0 +end + +-- return the required param2 for solar modules +local function get_param2(pos, side) + local node = minetest.get_node(pos) + local dir = power.side_to_dir(node.param2, side) + return (dir + 1) % 4 +end + +-- do we have enough light? +local function light(pos) + pos.y = pos.y + 1 + local light = minetest.get_node_light(pos) or 0 + pos.y = pos.y - 1 + return light >= (minetest.LIGHT_MAX - 1) +end + +-- check if solar module is available and has the correct orientation +local function is_solar_module(base_pos, pos, side) + local pos1 = techage.get_pos(pos, side) + if pos1 then + local node = minetest.get_node(pos1) + if node and node.name == "techage:ta4_solar_module" and light(pos1) then + if side == "L" and node.param2 == M(base_pos):get_int("left_param2") then + return true + elseif side == "R" and node.param2 == M(base_pos):get_int("right_param2") then + return true + end + end + end + return false +end + +-- provide the available power, which is temperature dependent +local function on_getpower1(pos, mem) + local pos1 = {x = pos.x, y = pos.y, z = pos.z} + if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then + return PWR_PERF * M(pos):get_int("temperature") / 100.0 + end + return 0 +end + +local function on_getpower2(pos, mem) + local pos1 = {x = pos.x, y = pos.y+1, z = pos.z} + if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then + return PWR_PERF * M(pos):get_int("temperature") / 100.0 + end + return 0 +end + + +minetest.register_node("techage:ta4_solar_module", { + description = S("TA4 Solar Module"), + tiles = { + -- up, down, right, left, back, front + "techage_solar_module_top.png", + "techage_solar_module_bottom.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/2, 7/16, -1/2, 1/2, 8/16, 16/16}, + }, + }, + + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + is_ground_content = false, +}) + +minetest.register_node("techage:ta4_solar_carrier", { + description = S("TA4 Solar Carrier Module"), + tiles = { + -- up, down, right, left, back, front + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", + "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-3/8, -8/16, -1/2, 3/8, -6/16, 1/2}, + {-1/8, -6/16, -1/2, 1/8, 6/16, 1/2}, + {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, + }, + }, + + after_place_node = function(pos) + M(pos):set_int("temperature", temperature(pos)) + M(pos):set_int("left_param2", get_param2(pos, "L")) + M(pos):set_int("right_param2", get_param2(pos, "R")) + end, + + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + is_ground_content = false, +}) + +minetest.register_node("techage:ta4_solar_carrierB", { + description = S("TA4 Solar Carrier Module B"), + tiles = { + -- up, down, right, left, back, front + "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", + "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-3/8, -8/16, -1/2, 3/8, -6/16, 1/2}, + {-1/8, -6/16, -1/2, 1/8, 8/16, 1/2}, + }, + }, + + after_place_node = function(pos) + M(pos):set_int("temperature", temperature(pos)) + M(pos):set_int("left_param2", get_param2(pos, "L")) + M(pos):set_int("right_param2", get_param2(pos, "R")) + end, + + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + is_ground_content = false, +}) + +minetest.register_node("techage:ta4_solar_carrierT", { + description = S("TA4 Solar Carrier Module T"), + tiles = { + -- up, down, right, left, back, front + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + "techage_concrete.png^[brighten", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/8, -8/16, -1/2, 1/8, 6/16, 1/2}, + {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, + }, + }, + + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, choppy=2}, + is_ground_content = false, +}) + +techage.power.register_node({"techage:ta4_solar_carrier"}, { + power_network = Cable, + on_getpower = on_getpower1, + conn_sides ={"F", "B"}, +}) + +techage.power.register_node({"techage:ta4_solar_carrierB"}, { + power_network = Cable, + on_getpower = on_getpower2, + conn_sides ={"F", "B"}, +}) + +minetest.register_craft({ + output = "techage:ta4_solar_module", + recipe = { + {"techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer"}, + {"default:tin_ingot", "default:copper_ingot", "default:tin_ingot"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_solar_carrierB 2", + recipe = { + {"", "default:steel_ingot", ""}, + {"", "techage:ta4_power_cableS", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_solar_carrierT 2", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"", "techage:ta4_power_cableS", ""}, + }, +}) + +minetest.register_craft({ + output = "techage:ta4_solar_carrier", + recipe = { + {"", "techage:ta4_solar_carrierT", ""}, + {"", "techage:ta4_solar_carrierB", ""}, + {"", "", ""}, + }, +}) diff --git a/textures/techage_appl_inverter.png b/textures/techage_appl_inverter.png new file mode 100644 index 0000000..30bb229 Binary files /dev/null and b/textures/techage_appl_inverter.png differ diff --git a/textures/techage_appl_ta4_cable.png b/textures/techage_appl_ta4_cable.png new file mode 100644 index 0000000..2db7e5f Binary files /dev/null and b/textures/techage_appl_ta4_cable.png differ diff --git a/textures/techage_solar_module_bottom.png b/textures/techage_solar_module_bottom.png new file mode 100644 index 0000000..d9a2b04 Binary files /dev/null and b/textures/techage_solar_module_bottom.png differ diff --git a/textures/techage_solar_module_top.png b/textures/techage_solar_module_top.png new file mode 100644 index 0000000..4be6844 Binary files /dev/null and b/textures/techage_solar_module_top.png differ diff --git a/textures/techage_ta4_cable.png b/textures/techage_ta4_cable.png new file mode 100644 index 0000000..0b34f1a Binary files /dev/null and b/textures/techage_ta4_cable.png differ diff --git a/textures/techage_ta4_cable_end.png b/textures/techage_ta4_cable_end.png new file mode 100644 index 0000000..12f9c0e Binary files /dev/null and b/textures/techage_ta4_cable_end.png differ diff --git a/textures/techage_ta4_junctionbox_side.png b/textures/techage_ta4_junctionbox_side.png new file mode 100644 index 0000000..e5f00c0 Binary files /dev/null and b/textures/techage_ta4_junctionbox_side.png differ diff --git a/textures/techage_ta4_junctionbox_top.png b/textures/techage_ta4_junctionbox_top.png new file mode 100644 index 0000000..d2fb487 Binary files /dev/null and b/textures/techage_ta4_junctionbox_top.png differ diff --git a/textures/techage_ta4_solar.png b/textures/techage_ta4_solar.png new file mode 100644 index 0000000..ea9d118 Binary files /dev/null and b/textures/techage_ta4_solar.png differ