update castles modpack, boost_cart, homedecor, currency, farming redo,

framed glass, gloopblocks, mesecons, moreblocks, pipeworks, signs_lib,
technic, unified mesecons, and worldedit

created a new tag for this release (this will be standard procedure from
now on)
master
Vanessa Ezekowitz 2017-09-26 00:11:57 -04:00
parent 4aab7d0dbd
commit 3d08b568ad
113 changed files with 5388 additions and 476 deletions

70
anvil/locale/fr.po Normal file
View File

@ -0,0 +1,70 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-06-26 12:18+0200\n"
"PO-Revision-Date: 2017-06-26 12:22+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.2\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: init.lua:19
msgid "Steel blacksmithing hammer"
msgstr "Marteau de forgeron en acier"
#: init.lua:20
msgid "A tool for repairing other tools at a blacksmith's anvil."
msgstr "Un outil pour réparer les autres outils avec une enclume de forgeron."
#: init.lua:21
msgid ""
"Use this hammer to strike blows upon an anvil bearing a damaged tool and you "
"can repair it. It can also be used for smashing stone, but it is not well "
"suited to this task."
msgstr ""
"Utilisez ce marteau pour frapper une enclume contenant un outil endommagé, "
"ainsi vous pourrez le réparer. Il peut être aussi utilisé pour casser de la "
"pierre, mais il n'est pas adapté à cette tâche."
#: init.lua:98
msgid "Anvil"
msgstr "Enclume"
#: init.lua:99
msgid ""
"A tool for repairing other tools in conjunction with a blacksmith's hammer."
msgstr ""
"Un outil pour réparer les autres outils à utiliser avec un marteau de "
"forgeron."
#: init.lua:100
msgid ""
"Right-click on this anvil with a damaged tool to place the damaged tool upon "
"it. You can then repair the damaged tool by striking it with a blacksmith's "
"hammer. Repeated blows may be necessary to fully repair a badly worn tool. "
"To retrieve the tool either punch or right-click the anvil with an empty "
"hand."
msgstr ""
"Cliquez-droit sur cette enclume avec un outil endommagé pour le placer "
"dessus. Vous pourrez alors réparer l'outil endommagé en le frappant avec un "
"marteau de forgeron. Des coups successifs seront nécessaires pour réparer "
"l'outil entièrement. Pour récupérer l'outil, frappez dessus ou faites un "
"click-droit en ayant la main vide."
#: init.lua:155
msgid "This anvil is for damaged tools only."
msgstr "L'enclume s'utilise sur les outils endommagés."
#: init.lua:267
msgid "Your @1 has been repaired successfully."
msgstr "Votre @1 a été réparé avec succès."

68
anvil/locale/it.po Normal file
View File

@ -0,0 +1,68 @@
# ITALIAN LOCALE FILE FOR THE ANVIL MODULE
# Copyright (C) 2017 Sokomine
# This file is distributed under the same license as the ANVIL package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Italian locale file for the Anvil module\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-07 22:17-0700\n"
"PO-Revision-Date: 2017-08-18 16:14+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.6.10\n"
#: init.lua:19
msgid "Steel blacksmithing hammer"
msgstr "Martello da fabbro di acciaio"
#: init.lua:20
msgid "A tool for repairing other tools at a blacksmith's anvil."
msgstr "Un attrezzo per riparare altri attrezzi su di una incudine da fabbro."
#: init.lua:21
msgid ""
"Use this hammer to strike blows upon an anvil bearing a damaged tool and you "
"can repair it. It can also be used for smashing stone, but it is not well "
"suited to this task."
msgstr ""
"Usate questo martello per colpire una incudine su cui è posto un attrezzo "
"danneggiato e potrete ripararlo. Può anche essere usato per colpire la "
"pietra, ma non è molto adatto a questo compito."
#: init.lua:98
msgid "Anvil"
msgstr "Incudine"
#: init.lua:99
msgid ""
"A tool for repairing other tools in conjunction with a blacksmith's hammer."
msgstr "Un attrezzo per riparare altri attrezzi usando un martello da fabbro."
#: init.lua:100
msgid ""
"Right-click on this anvil with a damaged tool to place the damaged tool upon "
"it. You can then repair the damaged tool by striking it with a blacksmith's "
"hammer. Repeated blows may be necessary to fully repair a badly worn tool. "
"To retrieve the tool either punch or right-click the anvil with an empty "
"hand."
msgstr ""
"Fate click destro su questa incudine con un attrezzo danneggiato per "
"metterlo sull'incudine. Poi potrete ripararlo colpendolo con un martello da "
"fabbro. Potrebbero essere necessari più colpi per riparare un attrezzo "
"gravemente danneggiato. Per riprendere l'attrezzo colpite o fate click "
"destro sull'incudine a mani vuote."
#: init.lua:155
msgid "This anvil is for damaged tools only."
msgstr "Questa incudine è solo per attrezzi danneggiati."
#: init.lua:267
msgid "Your @1 has been repaired successfully."
msgstr "La/il vostr* @1 è stat* riparat* con successo."

View File

@ -1,8 +1,8 @@
Minetest mod: boost_cart
==========================
Based on (and fully compatible with) the mod "carts" by PilzAdam
Also compatible with the carts mod in the subgame "minetest_game".
Target: Run smoothly as possible even on laggy server
and the one contained in the subgame "minetest_game".
Target: Run smoothly as possible, even on laggy servers.
Features
@ -12,8 +12,25 @@ Target: Run smoothly as possible even on laggy server
- Boost and brake rails
- By mesecons controlled Start-Stop rails
- Detector rails that send a mesecons signal when the cart drives over them
- Rail junction switching with the 'right-left' walking keys
- Rail junction switching with the 'right/left' walking keys
- Handbrake with the 'back' key
- Support for non-minetest_game subgames
Settings
----------
This mod can be adjusted to fit the conditions of a player or server.
Use the Advanced Settings dialog in the main menu or tune your
minetest.conf file manually:
boost_cart.speed_max = 10
^ Possible values: 1 ... 100
^ Maximal speed of the cart in m/s
boost_cart.punch_speed_max = 7
^ Possible values: -1 ... 100
^ Maximal speed to which the driving player can accelerate the cart
by punching from inside the cart. -1 will disable this feature.
License for everything

View File

@ -18,7 +18,9 @@ function boost_cart:manage_attachment(player, obj)
default.player_attached[player_name] = status
if status then
player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0})
-- player_api came after the new model. Check for it.
local y_pos = player_api and -4.5 or 6
player:set_attach(obj, "", {x=0, y=y_pos, z=0}, {x=0, y=0, z=0})
player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0})
else
player:set_detach()

View File

@ -16,13 +16,6 @@ boost_cart.speed_max = tonumber(setting_getter("boost_cart.speed_max")) or 10
-- Set to -1 to disable punching the cart from inside
boost_cart.punch_speed_max = tonumber(setting_getter("boost_cart.punch_speed_max")) or 7
if not boost_cart.modpath then
-- For Minetest 0.4.12 and older that don't look at the "mod.conf" file
error("\nWrong mod directory name! Please change it to 'boost_cart'.\n" ..
"See also: http://dev.minetest.net/Installing_Mods")
end
-- Support for non-default games
if not default.player_attached then
default.player_attached = {}

View File

@ -0,0 +1,30 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2017
# This file is distributed under the same license as the castle_farming package.
# Caio Roberto <caiorrs@gmail.com>, 2017.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-27 00:59-0700\n"
"PO-Revision-Date: 2017-06-29 13:00-0330\n"
"Last-Translator: Caio Roberto <caiorrs@gmail.com>\n"
"Language-Team: Paulo Slomp FACED UFRGS <00009228@ufrgs.br>\n"
"Language: Brazilian Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: hides.lua:9
msgid "Hides"
msgstr "Esconde-se"
#: straw.lua:13
msgid "Bound Straw"
msgstr "Palha Amarrada"
#: straw.lua:22
msgid "Training Dummy"
msgstr "Vaca Parada de Madeira (para Laço)"

View File

@ -91,34 +91,33 @@ castle_gates.register_gate_slot = function(material)
minetest.register_craft({
output = mod_name..":"..material.name.."_portcullis_slot 3",
output = mod_name..":"..material.name.."_gate_slot 2",
recipe = {
{material.craft_material,"",material.craft_material},
{material.craft_material,"",material.craft_material},
{material.craft_material,"",material.craft_material},
},
})
minetest.register_craft({
output = mod_name..":"..material.name.."_portcullis_slot",
output = mod_name..":"..material.name.."_gate_slot",
type = "shapeless",
recipe = {mod_name..":"..material.name.."_portcullis_slot_reverse"},
recipe = {mod_name..":"..material.name.."_gate_slot_reverse"},
})
minetest.register_craft({
output = mod_name..":"..material.name.."_portcullis_slot_reverse",
output = mod_name..":"..material.name.."_gate_slot_reverse",
type = "shapeless",
recipe = {mod_name..":"..material.name.."_portcullis_slot"},
recipe = {mod_name..":"..material.name.."_gate_slot"},
})
if burn_time > 0 then
minetest.register_craft({
type = "fuel",
recipe = mod_name..":"..material.name.."_portcullis_slot",
recipe = mod_name..":"..material.name.."_gate_slot",
burntime = burn_time * 2,
})
minetest.register_craft({
type = "fuel",
recipe = mod_name..":"..material.name.."_portcullis_slot_reverse",
recipe = mod_name..":"..material.name.."_gate_slot_reverse",
burntime = burn_time * 2,
})
end

View File

@ -0,0 +1,55 @@
# ITALIAN LOCALE FILE FOR THE CASTLE LIGHTING MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE LIGHTING package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Lighting\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-01 23:52-0700\n"
"PO-Revision-Date: 2017-09-10 22:00+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.6.10\n"
#: brasier.lua:7
msgid "A brasier for producing copious amounts of light and heat."
msgstr "Un braciere per produrre grandi quantità di luce e calore."
#: brasier.lua:8
msgid ""
"To ignite the brasier place a flammable fuel in its inventory slot. A lump "
"of coal will burn for about half an hour."
msgstr ""
"Per accendere il braciere mettete del combustibile nella sua casella di "
"inventario. Un grumo di carbone brucerà per circa mezz'ora."
#: brasier.lua:107
msgid "Floor Brasier"
msgstr "Braciere da pavimento"
#: brasier.lua:156
msgid "Stonebrick"
msgstr "Mattoni di pietra"
#: brasier.lua:228
msgid "@1 Brasier"
msgstr "Braciere di @1"
#: init.lua:17
msgid "Light Block"
msgstr "Lampada"
#: init.lua:37
msgid "Chandelier"
msgstr "Candeliere"
#: init.lua:76
msgid "Chandelier Chain"
msgstr "Catena per candeliere"

View File

@ -3,4 +3,5 @@ moreblocks?
stairs?
building_blocks?
asphalt?
streets?
streets?
intllib?

189
castle_masonry/locale/fr.po Normal file
View File

@ -0,0 +1,189 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-21 23:41-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: arrow_slits.lua:12
msgid "@1 Arrowslit"
msgstr "Meurtrière en @1"
#: arrow_slits.lua:33
msgid "@1 Arrowslit with Cross"
msgstr "Meurtrière en croix en @1"
#: arrow_slits.lua:58
msgid "@1 Arrowslit with Hole"
msgstr "Meurtrière avec trou en @1"
#: arrow_slits.lua:81
msgid "@1 Embrasure"
msgstr "Embrasure en @1"
#: init.lua:29
msgid "Stonewall"
msgstr "Pierre brune"
#: init.lua:32
msgid "Cobble"
msgstr "Pavé"
#: init.lua:35
msgid "Stonebrick"
msgstr "Brique de pierre"
#: init.lua:38
msgid "Sandstone Brick"
msgstr "Brique de grès"
#: init.lua:41
msgid "Desert Stone Brick"
msgstr "Brique de pierre du désert"
#: init.lua:44
msgid "Stone"
msgstr "Pierre"
#: init.lua:47
msgid "Sandstone"
msgstr "Grès"
#: init.lua:50
msgid "Desert Stone"
msgstr "Pierre du désert"
#: init.lua:53
msgid "Wood"
msgstr "Bois"
#: init.lua:56
msgid "Ice"
msgstr "Glace"
#: init.lua:59
msgid "Snow"
msgstr "Neige"
#: init.lua:62
msgid "Obsidian Brick"
msgstr "Brique d'obsidienne"
#: murder_holes.lua:14
msgid "@1 Murder Hole"
msgstr "Trou en @1"
#: murder_holes.lua:33
msgid "@1 Machicolation"
msgstr "Machicoulis en @1"
#: paving.lua:11
msgid "Paving Stone"
msgstr "Pierre de pavage"
#: paving.lua:30
msgid "Pavement Brick"
msgstr "Brique de pavage"
#: paving.lua:40
msgid "Castle Pavement Stair"
msgstr "Escaliers de chateau pavé"
#: paving.lua:41
msgid "Castle Pavement Slab"
msgstr "Dalle de chateau pavé"
#: paving.lua:49
msgid "Roof Slates"
msgstr "Toiture en ardoise"
#: pillars.lua:18
msgid "@1 Pillar Base"
msgstr "Base de pilier en @1"
#: pillars.lua:36
msgid "@1 Half Pillar Base"
msgstr "Base de demi pilier en @1"
#: pillars.lua:54
msgid "@1 Pillar Top"
msgstr "Haut de pilier en @1"
#: pillars.lua:72
msgid "@1 Half Pillar Top"
msgstr "Haut de demi pilier en @1"
#: pillars.lua:90
msgid "@1 Pillar Middle"
msgstr "Milieu de pilier en @1"
#: pillars.lua:106
msgid "@1 Half Pillar Middle"
msgstr "Milieu de demi pilier en @1"
#: pillars.lua:123
msgid "@1 Crossbrace"
msgstr "Travers en @1"
#: pillars.lua:147
msgid "@1 Extended Crossbrace"
msgstr "Travers entendu en @1"
#: stone_wall.lua:11
msgid "Castle Wall"
msgstr "Pierre brune"
#: stone_wall.lua:22
msgid "Castle Rubble"
msgstr "Gravats de chateau"
#: stone_wall.lua:57
msgid "Castle Corner"
msgstr "Angle de chateau"
#: stone_wall.lua:78
msgid "Stone Wall"
msgstr "Mur de pierre"
#: stone_wall.lua:86
msgid "Rubble"
msgstr "Décombre"
#: stone_wall.lua:100
msgid "Castle Stonewall Stair"
msgstr "Escalier en pierre brune"
#: stone_wall.lua:101
msgid "Castle Stonewall Slab"
msgstr "Dalle en pierre brune"
#: stone_wall.lua:108
msgid "Castle Rubble Stair"
msgstr "Escalier en gravats de chateau"
#: stone_wall.lua:109
msgid "Castle Rubble Slab"
msgstr "Dalle en gravats de chateau"
#: stone_wall.lua:117 stone_wall.lua:143
msgid "Dungeon Stone"
msgstr "Pierre de dongeon"
#: stone_wall.lua:156
msgid "Dungeon Stone Stair"
msgstr "Escalier en pierre de dongeon"
#: stone_wall.lua:157
msgid "Dungeon Stone Slab"
msgstr "Dalle en pierre de dongeon"

191
castle_masonry/locale/it.po Normal file
View File

@ -0,0 +1,191 @@
# ITALIAN LOCALE FILE FOR THE CASTLE MASONRY MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE MASONRY package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Masonry\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-21 23:41-0700\n"
"PO-Revision-Date: 2017-09-10 22:36+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
"X-Generator: Poedit 1.6.10\n"
#: arrow_slits.lua:12
msgid "@1 Arrowslit"
msgstr "Feritoia per frecce di @1"
#: arrow_slits.lua:33
msgid "@1 Arrowslit with Cross"
msgstr "Feritoia a croce per frecce di @1"
#: arrow_slits.lua:58
msgid "@1 Arrowslit with Hole"
msgstr "Feritoia a foro per frecce di @1"
#: arrow_slits.lua:81
msgid "@1 Embrasure"
msgstr "Feritoia di @1"
#: init.lua:29
msgid "Stonewall"
msgstr "muro di pietra"
#: init.lua:32
msgid "Cobble"
msgstr "ciottoli"
#: init.lua:35
msgid "Stonebrick"
msgstr "mattoni di pietra"
#: init.lua:38
msgid "Sandstone Brick"
msgstr "mattoni di arenaria del deserto"
#: init.lua:41
msgid "Desert Stone Brick"
msgstr "mattoni di pietra del deserto"
#: init.lua:44
msgid "Stone"
msgstr "pietra"
#: init.lua:47
msgid "Sandstone"
msgstr "arenaria"
#: init.lua:50
msgid "Desert Stone"
msgstr "pietra del deserto"
#: init.lua:53
msgid "Wood"
msgstr "legno"
#: init.lua:56
msgid "Ice"
msgstr "ghiaccio"
#: init.lua:59
msgid "Snow"
msgstr "neve"
#: init.lua:62
msgid "Obsidian Brick"
msgstr "mattoni di ossidiana"
#: murder_holes.lua:14
msgid "@1 Murder Hole"
msgstr "Buca assassina di @1"
#: murder_holes.lua:33
msgid "@1 Machicolation"
msgstr "Caditoia di @1"
#: paving.lua:11
msgid "Paving Stone"
msgstr "Pietra pavimentale"
#: paving.lua:30
msgid "Pavement Brick"
msgstr "Mattoni pavimentali"
#: paving.lua:40
msgid "Castle Pavement Stair"
msgstr "Scala pavimentale del castello"
#: paving.lua:41
msgid "Castle Pavement Slab"
msgstr "Lastra pavimentale del castello"
#: paving.lua:49
msgid "Roof Slates"
msgstr "Tegole di ardesia"
#: pillars.lua:18
msgid "@1 Pillar Base"
msgstr "Base della colonna di @1"
#: pillars.lua:36
msgid "@1 Half Pillar Base"
msgstr "Mezza base della colonna di @1"
#: pillars.lua:54
msgid "@1 Pillar Top"
msgstr "Capitello di @1"
#: pillars.lua:72
msgid "@1 Half Pillar Top"
msgstr "Mezzo capitello di @1"
#: pillars.lua:90
msgid "@1 Pillar Middle"
msgstr "Fusto della colonna di @1"
#: pillars.lua:106
msgid "@1 Half Pillar Middle"
msgstr "Mezzo fusto della colonna di @1"
#: pillars.lua:123
msgid "@1 Crossbrace"
msgstr "Costolone di @1"
#: pillars.lua:147
msgid "@1 Extended Crossbrace"
msgstr "Costolone esteso di @1"
#: stone_wall.lua:11
msgid "Castle Wall"
msgstr "Muro del castello"
#: stone_wall.lua:22
msgid "Castle Rubble"
msgstr "Detriti del castello"
#: stone_wall.lua:57
msgid "Castle Corner"
msgstr "Angolo del castello"
#: stone_wall.lua:78
msgid "Stone Wall"
msgstr "Muro di pietra"
#: stone_wall.lua:86
msgid "Rubble"
msgstr "Detriti"
#: stone_wall.lua:100
msgid "Castle Stonewall Stair"
msgstr "Scala del castello in muro di pietra"
#: stone_wall.lua:101
msgid "Castle Stonewall Slab"
msgstr "Lastra del castello in muro di pietra"
#: stone_wall.lua:108
msgid "Castle Rubble Stair"
msgstr "Scala del castello in detriti"
#: stone_wall.lua:109
msgid "Castle Rubble Slab"
msgstr "Lastra del castello in detriti"
#: stone_wall.lua:117 stone_wall.lua:143
msgid "Dungeon Stone"
msgstr "Pietra del sotterraneo"
#: stone_wall.lua:156
msgid "Dungeon Stone Stair"
msgstr "Scala di pietra del sotterraneo"
#: stone_wall.lua:157
msgid "Dungeon Stone Slab"
msgstr "Lastra di pietra del sotterraneo"

View File

@ -173,11 +173,11 @@ castle_masonry.register_pillar = function(material)
})
minetest.register_craft({
output = mod_name..":pillar_"..material.name.."_middle 4",
output = mod_name..":pillar_"..material.name.."_middle 2",
recipe = {
{material.craft_material,material.craft_material},
{material.craft_material,material.craft_material},
{material.craft_material,material.craft_material} },
{material.craft_material},
{material.craft_material},
{material.craft_material} },
})
minetest.register_craft({

View File

@ -0,0 +1,23 @@
# ITALIAN LOCALE FILE FOR THE CASTLE SHIELDS MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE SHIELDS package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Shields\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 14:47-0700\n"
"PO-Revision-Date: 2017-09-10 22:38+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
"X-Generator: Poedit 1.6.10\n"
#: init.lua:6 init.lua:41 init.lua:75
msgid "Mounted Shield"
msgstr "Scudo appeso"

View File

@ -0,0 +1,56 @@
# ITALIAN LOCALE FILE FOR THE CASTLE STORAGE MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE STORAGE package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Storage\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 19:18-0700\n"
"PO-Revision-Date: 2017-09-10 22:46+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
"X-Generator: Poedit 1.6.10\n"
#: crate.lua:9 crate.lua:24
msgid "Crate"
msgstr "Cassa"
#: crate.lua:34
msgid "@1 moves stuff in crate at @2"
msgstr "@1 mette delle cose nella cassa alle coordinate @2"
#: crate.lua:37
msgid "@1 moves stuff to crate at @2"
msgstr "@1 prende delle cose dalla cassa alle coordinate @2"
#: crate.lua:40 ironbound_chest.lua:113
msgid "@1 takes stuff from locked chest at @2"
msgstr "@1 prende delle cose dal baule chiuso a chiave alle coordinate @2"
#: ironbound_chest.lua:35 ironbound_chest.lua:69
msgid "Ironbound Chest"
msgstr "Baule rinforzato col ferro"
#: ironbound_chest.lua:65
msgid "Ironbound Chest (owned by @1)"
msgstr "Baule rinforzato col ferro (di @1)"
#: ironbound_chest.lua:82 ironbound_chest.lua:91 ironbound_chest.lua:100
msgid "@1 tried to access a locked chest belonging to @2 at @3"
msgstr ""
"@1 ha tentato di aprire un baule chiuso a chiave di @2 alle coordinate @3"
#: ironbound_chest.lua:107
msgid "@1 moves stuff in locked chest at @2"
msgstr "@1 sposta delle cose nel baule chiuso a chiave alle coordinate @2"
#: ironbound_chest.lua:110
msgid "@1 moves stuff to locked chest at @2"
msgstr "@1 mette delle cose nel baule chiuso a chiave alle coordinate @2"

View File

@ -0,0 +1,35 @@
# ITALIAN LOCALE FILE FOR THE CASTLE TAPESTRIES MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE TAPESTRIES package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Tapestries\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 14:32-0700\n"
"PO-Revision-Date: 2017-09-20 00:41+0100\n"
"Last-Translator: Hamlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
"X-Generator: Poedit 1.6.10\n"
#: init.lua:14
msgid "Tapestry Top"
msgstr "Cima dell'arazzo"
#: init.lua:64
msgid "Tapestry"
msgstr "Arazzo"
#: init.lua:94
msgid "Tapestry (Long)"
msgstr "Arazzo (lungo)"
#: init.lua:124
msgid "Tapestry (Very Long)"
msgstr "Arazzo (molto lungo)"

View File

@ -0,0 +1,31 @@
# ITALIAN LOCALE FILE FOR THE CASTLE WEAPONS MODULE
# Copyright (C) 2017 Philipbenr And DanDuncombe
# This file is distributed under the same license as the CASTLE WEAPONS package.
# Hamlet <h4mlet@riseup.net>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: Castle Weapons\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-25 19:35-0700\n"
"PO-Revision-Date: 2017-09-10 22:49+0100\n"
"Last-Translator: H4mlet <h4mlet@riseup.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: it\n"
"X-Generator: Poedit 1.6.10\n"
#: battleaxe.lua:8
msgid "Battleaxe"
msgstr "Ascia da guerra"
#: crossbow.lua:244
msgid "Bolt"
msgstr "Quadrello"
#: crossbow.lua:357 crossbow.lua:416
msgid "Crossbow"
msgstr "Balestra"

6
computer/locale/ru.txt Normal file
View File

@ -0,0 +1,6 @@
# Language: Russian
# Author: inpos <inpos@yandex.ru>
Plastic sheet = Лист пластика
Unprocessed Plastic base = Необработанная пластиковая основа

View File

@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-20 13:58-0700\n"
"PO-Revision-Date: 2017-08-11 17:09+0300\n"
"PO-Revision-Date: 2017-08-11 19:03+0300\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Language: ru\n"
#: barter.lua:14 barter.lua:22

View File

@ -2,15 +2,40 @@
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
function default.get_safe_formspec(pos)
function default.get_safe_formspec(pos, page)
local spos = pos.x .. "," .. pos.y .. "," ..pos.z
local ipos = 50*page
local formspec =
"size[8,9]"..
"list[nodemeta:".. spos .. ";main;1,1;6,2;]"..
"list[current_player;main;0,5;8,4;]"
"size[8,11]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"button[1,-0.1;2,1;page1;Page 1]"..
"button[5,-0.1;2,1;page2;Page 2]"..
"list[nodemeta:".. spos .. ";main;0,0.9;8,6;"..ipos.."]"..
"list[current_player;main;0,7.2;8,4;]"..
"listring[nodemeta:".. spos .. ";main]"..
"listring[current_player;main]"
return formspec
end
local function show_safe_form(clicker, pos, page)
minetest.show_formspec(
clicker:get_player_name(),
"currency:safe",
default.get_safe_formspec(pos, page)
)
minetest.register_on_receive_fields(function(player, form, pressed)
print("[SAFE] page button pressed: "..dump(pressed))
if form=="currency:safe" then
if pressed.page1 then show_safe_form(clicker, pos, 0) end
if pressed.page2 then show_safe_form(clicker, pos, 1) end
end
end)
end
local function has_safe_privilege(meta, player)
local name = ""
if player then
@ -31,13 +56,19 @@ minetest.register_node("currency:safe", {
paramtype = "light",
paramtype2 = "facedir",
tiles = {"safe_side.png",
"safe_side.png",
"safe_side.png",
"safe_side.png",
"safe_side.png",
"safe_side.png",
"safe_front.png",},
is_ground_content = false,
groups = {cracky=1},
on_rightclick = function(pos, node, clicker)
local meta = minetest.get_meta(pos)
if has_safe_privilege(meta, clicker) then
show_safe_form(clicker, pos, 0)
end
end,
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
@ -48,7 +79,7 @@ minetest.register_node("currency:safe", {
meta:set_string("infotext", "Safe")
meta:set_string("owner", "")
local inv = meta:get_inventory()
inv:set_size("main", 6*2)
inv:set_size("main", 12*8)
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
@ -64,7 +95,7 @@ minetest.register_node("currency:safe", {
end
return count
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not has_safe_privilege(meta, player) then
minetest.log("action", S("@1 tried to access a safe belonging to @2 at @3",
@ -73,7 +104,7 @@ minetest.register_node("currency:safe", {
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not has_safe_privilege(meta, player) then
minetest.log("action", S("@1 tried to access a safe belonging to @2 at @3",
@ -85,20 +116,10 @@ minetest.register_node("currency:safe", {
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
minetest.log("action", S("@1 moves stuff in safe at @2", player:get_player_name(), minetest.pos_to_string(pos)))
end,
on_metadata_inventory_put = function(pos, listname, index, stack, player)
on_metadata_inventory_put = function(pos, listname, index, stack, player)
minetest.log("action", S("@1 moves stuff to safe at @2", player:get_player_name(), minetest.pos_to_string(pos)))
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
on_metadata_inventory_take = function(pos, listname, index, stack, player)
minetest.log("action", S("@1 takes stuff from safe at @2", player:get_player_name(), minetest.pos_to_string(pos)))
end,
on_rightclick = function(pos, node, clicker)
local meta = minetest.get_meta(pos)
if has_safe_privilege(meta, clicker) then
minetest.show_formspec(
clicker:get_player_name(),
"currency:safe",
default.get_safe_formspec(pos)
)
end
end,
})

View File

@ -68,7 +68,7 @@ end
minetest.register_node("fake_fire:ice_fire", {
inventory_image = "ice_fire_inv.png",
description = desc,
description = S("Ice fire"),
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "facedir",

View File

@ -13,6 +13,8 @@ This mod works by adding your new plant to the {growing=1} group and numbering t
Changelog:
1.28 - Added chili peppers and bowl of chili, optimized code and fixed a few bugs, added porridge
1.27 - Added meshoptions to api and wheat plants, added farming.rarity setting to spawn more/less crops on map, have separate cotton/string items (4x cotton = 1x wool, 2x cotton = 2x string)
1.26 - Added support for [toolranks] mod when using hoe's
1.25 - Added check for farming.conf setting file to disable specific crops globally (inside mod folder) or world specific (inside world folder)
1.24 - Added Hemp which can be crafted into fibre, paper, string, rope and oil.
@ -48,7 +50,7 @@ Changelog:
0.1 - Fixed growing bug
0.0 - Initial release
Lucky Blocks: 11 (plus 3 for default farming items)
Lucky Blocks: 16
License of media (textures):
@ -60,6 +62,9 @@ Created by PilzAdam (License: WTFPL):
farming_soil_wet_side.png
farming_string.png
Created by Napiophelios (CC BY-SA 3.0):
farming_cotton.png
Created by Calinou (License: CC BY-SA):
farming_tool_bronzehoe.png
farming_tool_steelhoe.png

View File

@ -37,6 +37,8 @@ local crop_def = {
drawtype = "plantlike",
tiles = {"farming_barley_1.png"},
paramtype = "light",
paramtype2 = "meshoptions",
place_param2 = 3,
sunlight_propagates = true,
walkable = false,
buildable_to = true,

View File

@ -41,7 +41,7 @@ function place_beans(itemstack, placer, pointed_thing, plantname)
minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0})
if not minetest.setting_getbool("creative_mode") then
if not farming.is_creative(placer:get_player_name()) then
itemstack:take_item()

88
farming/chili.lua Normal file
View File

@ -0,0 +1,88 @@
local S = farming.intllib
-- chili pepper
minetest.register_craftitem("farming:chili_pepper", {
description = S("Chili Pepper"),
inventory_image = "farming_chili_pepper.png",
on_place = function(itemstack, placer, pointed_thing)
return farming.place_seed(itemstack, placer, pointed_thing, "farming:chili_1")
end,
on_use = minetest.item_eat(2),
})
-- bowl of chili
minetest.register_craftitem("farming:chili_bowl", {
description = S("Bowl of Chili"),
inventory_image = "farming_chili_bowl.png",
on_use = minetest.item_eat(8),
})
minetest.register_craft({
type = "shapeless",
output = "farming:chili_bowl",
recipe = {"farming:chili_pepper", "farming:barley", "farming:tomato", "farming:beans"}
})
-- chili can be used for red dye
minetest.register_craft({
output = "dye:red",
recipe = {
{'farming:chili_pepper'},
}
})
-- chili definition
local crop_def = {
drawtype = "plantlike",
tiles = {"farming_chili_1.png"},
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
drop = "",
selection_box = farming.select,
groups = {
snappy = 3, flammable = 4, plant = 1, attached_node = 1,
not_in_creative_inventory = 1, growing = 1
},
sounds = default.node_sound_leaves_defaults()
}
-- stage 1
minetest.register_node("farming:chili_1", table.copy(crop_def))
-- stage 2
crop_def.tiles = {"farming_chili_2.png"}
minetest.register_node("farming:chili_2", table.copy(crop_def))
-- stage 3
crop_def.tiles = {"farming_chili_3.png"}
minetest.register_node("farming:chili_3", table.copy(crop_def))
-- stage 4
crop_def.tiles = {"farming_chili_4.png"}
minetest.register_node("farming:chili_4", table.copy(crop_def))
-- stage 5
crop_def.tiles = {"farming_chili_5.png"}
minetest.register_node("farming:chili_5", table.copy(crop_def))
-- stage 6
crop_def.tiles = {"farming_chili_6.png"}
minetest.register_node("farming:chili_6", table.copy(crop_def))
-- stage 7
crop_def.tiles = {"farming_chili_7.png"}
minetest.register_node("farming:chili_7", table.copy(crop_def))
-- stage 8 (final)
crop_def.tiles = {"farming_chili_8.png"}
crop_def.groups.growing = 0
crop_def.drop = {
items = {
{items = {'farming:chili_pepper 3'}, rarity = 1},
{items = {'farming:chili_pepper 2'}, rarity = 2},
}
}
minetest.register_node("farming:chili_8", table.copy(crop_def))

View File

@ -36,7 +36,7 @@ function place_cocoa(itemstack, placer, pointed_thing, plantname)
minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0})
if not minetest.setting_getbool("creative_mode") then
if not farming.is_creative(placer:get_player_name()) then
itemstack:take_item()

View File

@ -8,7 +8,7 @@ minetest.register_node("farming:seed_cotton", {
inventory_image = "farming_cotton_seed.png",
wield_image = "farming_cotton_seed.png",
drawtype = "signlike",
groups = {seed = 1, snappy = 3, attached_node = 1},
groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 4},
paramtype = "light",
paramtype2 = "wallmounted",
walkable = false,
@ -24,19 +24,46 @@ minetest.register_node("farming:seed_cotton", {
minetest.register_craftitem("farming:cotton", {
description = S("Cotton"),
inventory_image = "farming_cotton.png",
groups = {flammable = 4},
})
minetest.register_alias("farming:string", "farming:cotton")
minetest.register_craftitem("farming:string", {
description = S("String"),
inventory_image = "farming_string.png",
groups = {flammable = 2},
})
-- cotton to wool
minetest.register_craft({
output = "wool:white",
recipe = {
{"farming:string", "farming:string"},
{"farming:string", "farming:string"},
{"farming:cotton", "farming:cotton"},
{"farming:cotton", "farming:cotton"},
}
})
-- cotton to string
minetest.register_craft({
output = "farming:string 2",
recipe = {
{"farming:cotton"},
{"farming:cotton"},
}
})
-- can be used as fuel
minetest.register_craft({
type = "fuel",
recipe = "farming:string",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:cotton",
burntime = 1,
})
-- cotton definition
local crop_def = {
drawtype = "plantlike",
@ -48,7 +75,7 @@ local crop_def = {
drop = "",
selection_box = farming.select,
groups = {
snappy = 3, flammable = 2, plant = 1, attached_node = 1,
snappy = 3, flammable = 4, plant = 1, attached_node = 1,
not_in_creative_inventory = 1, growing = 1
},
sounds = default.node_sound_leaves_defaults()
@ -105,9 +132,9 @@ crop_def.tiles = {"farming_cotton_8.png"}
crop_def.groups.growing = 0
crop_def.drop = {
items = {
{items = {"farming:string"}, rarity = 1},
{items = {"farming:string"}, rarity = 2},
{items = {"farming:string"}, rarity = 3},
{items = {"farming:cotton"}, rarity = 1},
{items = {"farming:cotton"}, rarity = 2},
{items = {"farming:cotton"}, rarity = 3},
{items = {"farming:seed_cotton"}, rarity = 1},
{items = {"farming:seed_cotton"}, rarity = 2},
{items = {"farming:seed_cotton"}, rarity = 3},

View File

@ -12,7 +12,7 @@ minetest.register_craft({
output = "farming:donut 3",
recipe = {
{'', 'farming:wheat', ''},
{'farming:wheat', '', 'farming:wheat'},
{'farming:wheat', 'farming:sugar', 'farming:wheat'},
{'', 'farming:wheat', ''},
}
})
@ -46,3 +46,36 @@ minetest.register_craft({
{'farming:donut'},
}
})
-- Porridge Oats
minetest.register_craftitem("farming:porridge", {
description = S("Porridge"),
inventory_image = "farming_porridge.png",
on_use = minetest.item_eat(6),
})
minetest.after(0, function()
if minetest.get_modpath("mobs") and mobs and mobs.mod == "redo" then
minetest.register_craft({
output = "farming:porridge",
type = "shapeless",
recipe = {
"farming:barley", "farming:barley", "farming:wheat",
"farming:wheat", "mobs:bucket_milk"
},
replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}}
})
else
minetest.register_craft({
output = "farming:porridge",
type = "shapeless",
recipe = {
"farming:barley", "farming:barley", "farming:wheat",
"farming:wheat", "bucket:bucket_water"
},
replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}
})
end
end)

View File

@ -23,5 +23,9 @@ farming.rhubarb = true
farming.beans = true
farming.grapes = true
farming.barley = true
farming.chili = true
farming.hemp = true
farming.donuts = true
-- rarety of crops on map, default is 0.006 (higher number = more crops)
farming.rarety = 0.006

View File

@ -36,7 +36,7 @@ function place_grapes(itemstack, placer, pointed_thing, plantname)
minetest.sound_play("default_place_node", {pos = pt.under, gain = 1.0})
if not minetest.setting_getbool("creative_mode") then
if not farming.is_creative(placer:get_player_name()) then
itemstack:take_item()

View File

@ -14,6 +14,7 @@ for i = 3, 5 do
})
-- Override default dry grass and have it drop Barley Seeds
if minetest.registered_nodes["default:dry_grass_1"] then
minetest.override_item("default:dry_grass_" .. i, {

View File

@ -130,6 +130,12 @@ farming.register_hoe(":farming:hoe_wood", {
material = "group:wood"
})
minetest.register_craft({
type = "fuel",
recipe = "farming:hoe_wood",
burntime = 5,
})
farming.register_hoe(":farming:hoe_stone", {
description = S("Stone Hoe"),
inventory_image = "farming_tool_stonehoe.png",

View File

@ -1,5 +1,5 @@
--[[
Farming Redo Mod 1.25 (6th May 2017)
Farming Redo Mod
by TenPlus1
NEW growing routine by prestidigitator
auto-refill by crabman77
@ -8,53 +8,39 @@
farming = {}
farming.mod = "redo"
farming.path = minetest.get_modpath("farming")
farming.hoe_on_use = default.hoe_on_use
farming.select = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
}
local creative_mode_cache = minetest.setting_getbool("creative_mode")
function farming.is_creative(name)
return creative_mode_cache or minetest.check_player_privs(name, {creative = true})
end
local statistics = dofile(farming.path.."/statistics.lua")
-- Intllib
local S
if minetest.get_modpath("intllib") then
S = intllib.Getter()
else
S = function(s) return s end
end
local S = dofile(farming.path.."/intllib.lua")
farming.intllib = S
-- Utility Functions
-- Utility Function
local time_speed = tonumber(minetest.setting_get("time_speed")) or 72
local SECS_PER_CYCLE = (time_speed > 0 and 24 * 60 * 60 / time_speed) or 0
local function clamp(x, min, max)
return (x < min and min) or (x > max and max) or x
end
local function in_range(x, min, max)
return min <= x and x <= max
end
--- Tests the amount of day or night time between two times.
--
-- @param t_game
-- The current time, as reported by mintest.get_gametime().
-- @param t_day
-- The current time, as reported by mintest.get_timeofday().
-- @param dt
-- The amount of elapsed time.
-- @param count_day
-- If true, count elapsed day time. Otherwise, count elapsed night time.
-- @return
-- The amount of day or night time that has elapsed.
local function day_or_night_time(t_game, t_day, dt, count_day)
-- return amount of day or night that has elapsed
-- dt is time elapsed, count_day if true counts day, otherwise night
local function day_or_night_time(dt, count_day)
local t_day = minetest.get_timeofday()
local t1_day = t_day - dt / SECS_PER_CYCLE
local t1_c, t2_c -- t1_c < t2_c and t2_c always in [0, 1)
@ -88,45 +74,13 @@ local function day_or_night_time(t_game, t_day, dt, count_day)
return dt_c * SECS_PER_CYCLE
end
--- Tests the amount of elapsed day time.
--
-- @param dt
-- The amount of elapsed time.
-- @return
-- The amount of day time that has elapsed.
--
local function day_time(dt)
return day_or_night_time(minetest.get_gametime(), minetest.get_timeofday(), dt, true)
end
--- Tests the amount of elapsed night time.
--
-- @param dt
-- The amount of elapsed time.
-- @return
-- The amount of night time that has elapsed.
--
local function night_time(time_game, time_day, dt, count_day)
return day_or_night_time(minetest.get_gametime(), minetest.get_timeofday(), dt, false)
end
-- Growth Logic
local STAGE_LENGTH_AVG = 160.0
local STAGE_LENGTH_DEV = STAGE_LENGTH_AVG / 6
local MIN_LIGHT = 13
local MAX_LIGHT = 1000
--- Determines plant name and stage from node.
--
-- Separates node name on the last underscore (_).
--
-- @param node
-- Node or position table, or node name.
-- @return
-- List (plant_name, stage), or nothing (nil) if node isn't loaded
-- return plant name and stage from node provided
local function plant_name_stage(node)
local name
@ -161,6 +115,7 @@ local function plant_name_stage(node)
return name, 0
end
-- Map from node name to
-- { plant_name = ..., name = ..., stage = n, stages_left = { node_name, ... } }
@ -254,6 +209,7 @@ local function reg_plant_stages(plant_name, stage, force_last)
return stages
end
register_plant_node = function(node)
local plant_name, stage = plant_name_stage(node)
@ -267,6 +223,7 @@ register_plant_node = function(node)
end
end
local function set_growing(pos, stages_left)
if not stages_left then
@ -291,14 +248,8 @@ local function set_growing(pos, stages_left)
end
end
-- Detects a plant type node at the given position, starting
-- or stopping the plant growth timer as appopriate
-- @param pos
-- The node's position.
-- @param node
-- The cached node table if available, or nil.
-- detects a crop at given position, starting or stopping growth timer when needed
function farming.handle_growth(pos, node)
if not pos then
@ -312,6 +263,7 @@ function farming.handle_growth(pos, node)
end
end
minetest.after(0, function()
for _, node_def in ipairs(minetest.registered_nodes) do
@ -319,11 +271,11 @@ minetest.after(0, function()
end
end)
local abm_func = farming.handle_growth
-- Just in case a growing type or added node is missed (also catches existing
-- nodes added to map before timers were incorporated).
minetest.register_abm({
nodenames = { "group:growing" },
interval = 300,
@ -331,9 +283,8 @@ minetest.register_abm({
action = abm_func
})
-- Plant timer function.
-- Grows plants under the right conditions.
-- Plant timer function that grows plants under the right conditions.
function farming.plant_growth_timer(pos, elapsed, node_name)
local stages = plant_stages[node_name]
@ -351,7 +302,6 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
if stages.plant_name == "farming:cocoa" then
if not minetest.find_node_near(pos, 1, {"default:jungletree"}) then
return true
end
else
@ -363,19 +313,23 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
end
local growth
local light_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
local light_pos = {x = pos.x, y = pos.y, z = pos.z} -- was y + 1
local lambda = elapsed / STAGE_LENGTH_AVG
if lambda < 0.1 then
return true
end
local MIN_LIGHT = minetest.registered_nodes[node_name].minlight or 13
local MAX_LIGHT = minetest.registered_nodes[node_name].maxlight or 15
--print ("---", MIN_LIGHT, MAX_LIGHT)
if max_growth == 1 or lambda < 2.0 then
local light = (minetest.get_node_light(light_pos) or 0)
--print ("light level:", light)
if not in_range(light, MIN_LIGHT, MAX_LIGHT) then
if light < MIN_LIGHT or light > MAX_LIGHT then
return true
end
@ -383,8 +337,8 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
else
local night_light = (minetest.get_node_light(light_pos, 0) or 0)
local day_light = (minetest.get_node_light(light_pos, 0.5) or 0)
local night_growth = in_range(night_light, MIN_LIGHT, MAX_LIGHT)
local day_growth = in_range(day_light, MIN_LIGHT, MAX_LIGHT)
local night_growth = night_light >= MIN_LIGHT and night_light <= MAX_LIGHT
local day_growth = day_light >= MIN_LIGHT and day_light <= MAX_LIGHT
if not night_growth then
@ -392,11 +346,11 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
return true
end
lambda = day_time(elapsed) / STAGE_LENGTH_AVG
lambda = day_or_night_time(elapsed, true) / STAGE_LENGTH_AVG
elseif not day_growth then
lambda = night_time(elapsed) / STAGE_LENGTH_AVG
lambda = day_or_night_time(elapsed, false) / STAGE_LENGTH_AVG
end
growth = statistics.poisson(lambda, max_growth)
@ -407,7 +361,10 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
end
if minetest.registered_nodes[stages.stages_left[growth]] then
minetest.swap_node(pos, {name = stages.stages_left[growth]})
local p2 = minetest.registered_nodes[stages.stages_left[growth] ].place_param2 or 1
minetest.swap_node(pos, {name = stages.stages_left[growth], param2 = p2})
else
return true
end
@ -415,29 +372,8 @@ function farming.plant_growth_timer(pos, elapsed, node_name)
return growth ~= max_growth
end
-- refill placed plant by crabman (26/08/2015)
local can_refill_plant = {
["farming:blueberry_1"] = "farming:blueberries",
["farming:carrot_1"] = "farming:carrot",
["farming:coffee_1"] = "farming:coffee_beans",
["farming:corn_1"] = "farming:corn",
["farming:cotton_1"] = "farming:seed_cotton",
["farming:cucumber_1"] = "farming:cucumber",
["farming:melon_1"] = "farming:melon_slice",
["farming:potato_1"] = "farming:potato",
["farming:pumpkin_1"] = "farming:pumpkin_slice",
["farming:raspberry_1"] = "farming:raspberries",
["farming:rhubarb_1"] = "farming:rhubarb",
["farming:tomato_1"] = "farming:tomato",
["farming:wheat_1"] = "farming:seed_wheat",
["farming:grapes_1"] = "farming:grapes",
["farming:beans_1"] = "farming:beans",
["farming:rhubarb_1"] = "farming:rhubarb",
["farming:cocoa_1"] = "farming:cocoa_beans",
["farming:barley_1"] = "farming:seed_barley",
["farming:hemp_1"] = "farming:seed_hemp",
}
-- refill placed plant by crabman (26/08/2015) updated by TenPlus1
function farming.refill_plant(player, plantname, index)
local inv = player:get_inventory()
@ -454,14 +390,14 @@ function farming.refill_plant(player, plantname, index)
inv:set_stack("main", index, stack)
stack:clear()
inv:set_stack("main", i, stack)
--minetest.log("action", "farming: refilled stack("..plantname..") of " .. player:get_player_name() )
return
end
end
end
-- Place Seeds on Soil
-- Place Seeds on Soil
function farming.place_seed(itemstack, placer, pointed_thing, plantname)
local pt = pointed_thing
@ -504,22 +440,25 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname)
-- if not protected then add node and remove 1 item from the itemstack
if not minetest.is_protected(pt.above, placer:get_player_name()) then
minetest.set_node(pt.above, {name = plantname, param2 = 1})
local p2 = minetest.registered_nodes[plantname].place_param2 or 1
minetest.set_node(pt.above, {name = plantname, param2 = p2})
minetest.sound_play("default_place_node", {pos = pt.above, gain = 1.0})
if not minetest.setting_getbool("creative_mode") then
if not farming.is_creative(placer:get_player_name()) then
local name = itemstack:get_name()
itemstack:take_item()
-- check for refill
if itemstack:get_count() == 0
and can_refill_plant[plantname] then
if itemstack:get_count() == 0 then
minetest.after(0.10,
farming.refill_plant,
placer,
can_refill_plant[plantname],
name,
placer:get_wield_index()
)
end
@ -529,26 +468,23 @@ function farming.place_seed(itemstack, placer, pointed_thing, plantname)
end
end
-- Function to register plants (default farming compatibility)
farming.register_plant = function(name, def)
local mname = name:split(":")[1]
local pname = name:split(":")[2]
-- Check def table
if not def.description then
def.description = S("Seed")
end
if not def.inventory_image then
def.inventory_image = "unknown_item.png"
end
if not def.steps then
return nil
end
local mname = name:split(":")[1]
local pname = name:split(":")[2]
-- Check def
def.description = def.description or S("Seed")
def.inventory_image = def.inventory_image or "unknown_item.png"
def.minlight = def.minlight or 13
def.maxlight = def.maxlight or 15
-- Register seed
minetest.register_node(":" .. mname .. ":seed_" .. pname, {
@ -563,6 +499,8 @@ farming.register_plant = function(name, def)
walkable = false,
sunlight_propagates = true,
selection_box = farming.select,
place_param2 = def.place_param2 or nil,
next_plant = mname .. ":" .. pname .. "_1",
on_place = function(itemstack, placer, pointed_thing)
return farming.place_seed(itemstack, placer,
@ -592,7 +530,10 @@ farming.register_plant = function(name, def)
}
}
local g = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, growing = 1}
local g = {
snappy = 3, flammable = 2, plant = 1, growing = 1,
attached_node = 1, not_in_creative_inventory = 1,
}
-- Last step doesn't need growing=1 so Abm never has to check these
if i == def.steps then
@ -601,25 +542,35 @@ farming.register_plant = function(name, def)
local node_name = mname .. ":" .. pname .. "_" .. i
local next_plant = nil
if i < def.steps then
next_plant = mname .. ":" .. pname .. "_" .. (i + 1)
end
minetest.register_node(node_name, {
drawtype = "plantlike",
waving = 1,
tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"},
paramtype = "light",
paramtype2 = def.paramtype2 or nil,
place_param2 = def.place_param2 or nil,
walkable = false,
buildable_to = true,
drop = drop,
selection_box = farming.select,
groups = g,
sounds = default.node_sound_leaves_defaults(),
minlight = def.minlight,
maxlight = def.maxlight,
next_plant = next_plant,
})
register_plant_node(node_name)
end
-- Return info
local r = {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname}
return r
return {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname}
end
@ -641,8 +592,10 @@ farming.rhubarb = true
farming.beans = true
farming.grapes = true
farming.barley = true
farming.chili = true
farming.hemp = true
farming.donuts = true
farming.rarety = 0.006
-- Load new global settings if found inside mod folder
@ -663,12 +616,16 @@ if input then
end
-- load crops
-- important items
dofile(farming.path.."/soil.lua")
dofile(farming.path.."/hoes.lua")
dofile(farming.path.."/grass.lua")
-- default crops
dofile(farming.path.."/wheat.lua")
dofile(farming.path.."/cotton.lua")
-- additional crops and food (if enabled)
if farming.carrot then dofile(farming.path.."/carrot.lua") end
if farming.potato then dofile(farming.path.."/potato.lua") end
if farming.tomato then dofile(farming.path.."/tomato.lua") end
@ -685,8 +642,10 @@ if farming.rhubarb then dofile(farming.path.."/rhubarb.lua") end
if farming.beans then dofile(farming.path.."/beanpole.lua") end
if farming.grapes then dofile(farming.path.."/grapes.lua") end
if farming.barley then dofile(farming.path.."/barley.lua") end
if farming.chili then dofile(farming.path.."/chili.lua") end
if farming.hemp then dofile(farming.path.."/hemp.lua") end
if farming.donuts then dofile(farming.path.."/donut.lua") end
dofile(farming.path.."/mapgen.lua")
dofile(farming.path.."/compatibility.lua") -- Farming Plus compatibility
dofile(farming.path.."/lucky_block.lua")

45
farming/intllib.lua Normal file
View File

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- Get the latest version of this file at:
-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
local function format(str, ...)
local args = { ... }
local function repl(escape, open, num, close)
if escape == "" then
local replacement = tostring(args[tonumber(num)])
if open == "" then
replacement = replacement..close
end
return replacement
else
return "@"..open..num..close
end
end
return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
end
local gettext, ngettext
if minetest.get_modpath("intllib") then
if intllib.make_gettext_pair then
-- New method using gettext.
gettext, ngettext = intllib.make_gettext_pair()
else
-- Old method using text files.
gettext = intllib.Getter()
end
end
-- Fill in missing functions.
gettext = gettext or function(msgid, ...)
return format(msgid, ...)
end
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
return format(n==1 and msgid or msgid_plural, ...)
end
return gettext, ngettext

262
farming/locale/de.po Normal file
View File

@ -0,0 +1,262 @@
# German Translation for farming mod.
# Copyright (C) 2017
# This file is distributed under the same license as the farming package.
# Xanthin.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1.27\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-31 HO:MI+ZONE\n"
"PO-Revision-Date: 2016-03-31 HO:MI+ZONE\n"
"Last-Translator: Xanthin\n"
"Language-Team: \n"
"Language: German \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: barley.lua
msgid "Barley Seed"
msgstr "Gerstenkörner"
#: barley.lua
msgid "Barley"
msgstr "Gerste"
#: beanpole.lua
msgid "Green Beans"
msgstr "Grüne Bohnen"
#: beanpole.lua
msgid "Bean Pole (place on soil before planting beans)"
msgstr "Bohnenstange (vor dem Pflanzen der Bohnen auf den\nAckerboden stellen)"
#: blueberry.lua
msgid "Blueberries"
msgstr "Blaubeeren"
#: blueberry.lua
msgid "Blueberry Muffin"
msgstr "Blaubeermuffin"
#: carrot.lua
msgid "Carrot"
msgstr "Möhre"
#: carrot.lua
msgid "Golden Carrot"
msgstr "Goldene Möhre"
#: cocoa.lua
msgid "Cocoa Beans"
msgstr "Kakaobohne"
#: cocoa.lua
msgid "Cookie"
msgstr "Keks"
#: cocoa.lua
msgid "Bar of Dark Chocolate"
msgstr "Tafel Zartbitterschokolade"
#: coffee.lua
msgid "Coffee Beans"
msgstr "Kaffeebohnen"
#: coffee.lua
msgid "Drinking Cup (empty)"
msgstr "Tasse (leer)"
#: coffee.lua
msgid "Cold Cup of Coffee"
msgstr "Kalte Tasse Kaffee"
#: coffee.lua
msgid "Hot Cup of Coffee"
msgstr "Heiße Tasse Kaffee"
#: corn.lua
msgid "Corn"
msgstr "Mais"
#: corn.lua
msgid "Corn on the Cob"
msgstr "Maiskolben"
#: corn.lua
msgid "Bottle of Ethanol"
msgstr "Flasche Ethanol"
#: cotton.lua
msgid "Cotton Seed"
msgstr "Baumwollsamen"
#: cotton.lua
msgid "Cotton"
msgstr "Baumwolle"
#: cucumber.lua
msgid "Cucumber"
msgstr "Gurke"
#: donut.lua
msgid "Donut"
msgstr "Donut"
#: donut.lua
msgid "Chocolate Donut"
msgstr "Schokodonut"
#: donut.lua
msgid "Apple Donut"
msgstr "Apfeldonut"
#: grapes.lua
msgid "Grapes"
msgstr "Weintrauben"
#: grapes.lua
msgid "Trellis (place on soil before planting grapes)"
msgstr "Spalier (vor dem Pflanzen der Weintrauben auf den\nAckerboden stellen)"
#: hemp.lua
msgid "Hemp Seed"
msgstr ""
#: hemp.lua
msgid "Hemp Leaf"
msgstr ""
#: hemp.lua
msgid "Bottle of Hemp Oil"
msgstr ""
#: hemp.lua
msgid "Hemp Fibre"
msgstr ""
#: hemp.lua
msgid "Hemp Rope"
msgstr ""
#: ????
msgid "Hoe"
msgstr "Hacke"
#: hoes.lua
msgid "Wooden Hoe"
msgstr "Holzhacke"
#: hoes.lua
msgid "Stone Hoe"
msgstr "Steinhacke"
#: hoes.lua
msgid "Steel Hoe"
msgstr "Stahlhacke"
#: hoes.lua
msgid "Bronze Hoe"
msgstr "Bronzehacke"
#: hoes.lua
msgid "Mese Hoe"
msgstr "Mesehacke"
#: hoes.lua
msgid "Diamond Hoe"
msgstr "Diamanthacke"
#: init.lua
msgid "Seed"
msgstr "Saatgut"
#: melon.lua
msgid "Melon Slice"
msgstr "Melonenscheibe"
#: melon.lua
msgid "Melon"
msgstr "Melone"
#: potato.lua
msgid "Potato"
msgstr "Kartoffel"
#: potato.lua
msgid "Baked Potato"
msgstr "Ofenkartoffel"
#: pumpkin.lua
msgid "Pumpkin"
msgstr "Kürbis"
#: pumpkin.lua
msgid "Pumpkin Slice"
msgstr "Kürbisscheibe"
#: pumpkin.lua
msgid "Jack 'O Lantern (punch to turn on and off)"
msgstr "Kürbislaterne (Punch zum Ein- und Ausschalten)"
#: pumpkin.lua
msgid "Pumpkin Bread"
msgstr "Kürbisbrot"
#: pumpkin.lua
msgid "Pumpkin Dough"
msgstr "Kürbisteig"
#: raspberry.lua
msgid "Raspberries"
msgstr "Himbeeren"
#: raspberry.lua
msgid "Raspberry Smoothie"
msgstr "Himbeersmoothie"
#: rhubarb.lua
msgid "Rhubarb"
msgstr "Rhabarber"
#: rhubarb.lua
msgid "Rhubarb Pie"
msgstr "Rhabarberkuchen"
#: soil.lua
msgid "Soil"
msgstr "Ackerboden"
#: soil.lua
msgid "Wet Soil"
msgstr "Bewässerter Ackerboden"
#: sugar.lua
msgid "Sugar"
msgstr "Zucker"
#: tomato.lua
msgid "Tomato"
msgstr "Tomate"
#: wheat.lua
msgid "Wheat Seed"
msgstr "Weizenkörner"
#: wheat.lua
msgid "Wheat"
msgstr "Weizen"
#: wheat.lua
msgid "Straw"
msgstr "Stroh"
#: wheat.lua
msgid "Flour"
msgstr "Mehl"
#: wheat.lua
msgid "Bread"
msgstr "Brot"

258
farming/locale/pt.po Normal file
View File

@ -0,0 +1,258 @@
# Portuguese Translation for farming mod.
# Copyright (C) 2017
# This file is distributed under the same license as the farming package.
# BrunoMine <borgesdossantosbruno@gmail.com>, 2017.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.27\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-16 17:38-0300\n"
"PO-Revision-Date: 2017-08-17 17:01-0300\n"
"Last-Translator: BrunoMine <borgesdossantosbruno@gmail.com>\n"
"Language-Team: \n"
"Language: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Gtranslator 2.91.7\n"
#: barley.lua
msgid "Barley Seed"
msgstr "Sementes de Cevada"
#: barley.lua
msgid "Barley"
msgstr "Cevada"
#: beanpole.lua
msgid "Green Beans"
msgstr "Feijoes Verdes"
#: beanpole.lua
msgid "Bean Pole (place on soil before planting beans)"
msgstr "Apoio de feijao (coloque no solo antes de plantar feijao)"
#: blueberry.lua
msgid "Blueberries"
msgstr "Mirtilos"
#: blueberry.lua
msgid "Blueberry Muffin"
msgstr "Muffin de Mirtilos"
#: carrot.lua
msgid "Carrot"
msgstr "Cenoura"
#: carrot.lua
msgid "Golden Carrot"
msgstr "Cenoura Dourada"
#: cocoa.lua
msgid "Cocoa Beans"
msgstr "Amendoas de Cacau"
#: cocoa.lua
msgid "Cookie"
msgstr "Cookie"
#: cocoa.lua
msgid "Bar of Dark Chocolate"
msgstr "Barra de Chocolate Preto"
#: coffee.lua
msgid "Coffee Beans"
msgstr "Grao de Cafe"
#: coffee.lua
msgid "Drinking Cup (empty)"
msgstr "Xicara (vazia)"
#: coffee.lua
msgid "Cold Cup of Coffee"
msgstr "Xicara de Cafe Frio"
#: coffee.lua
msgid "Hot Cup of Coffee"
msgstr "Xicara de Cafe Quente"
#: corn.lua
msgid "Corn"
msgstr "Milho"
#: corn.lua
msgid "Corn on the Cob"
msgstr "Espiga de Milho"
#: corn.lua
msgid "Bottle of Ethanol"
msgstr "Garrafa de Etanol"
#: cotton.lua
msgid "Cotton Seed"
msgstr "Sementes de Algodao"
#: cotton.lua
msgid "Cotton"
msgstr "Algodao"
#: cucumber.lua
msgid "Cucumber"
msgstr "Pepino"
#: donut.lua
msgid "Donut"
msgstr "Donut"
#: donut.lua
msgid "Chocolate Donut"
msgstr "Donut de Chocolate"
#: donut.lua
msgid "Apple Donut"
msgstr "Donut de Maça"
#: grapes.lua
msgid "Grapes"
msgstr "Uvas"
#: grapes.lua
msgid "Trellis (place on soil before planting grapes)"
msgstr "Grade de Ripas (colocar no solo antes de plantar uvas)"
#: hemp.lua
msgid "Hemp Seed"
msgstr "Sementes de Canhamo"
#: hemp.lua
msgid "Hemp Leaf"
msgstr "Folha de Canhamo"
#: hemp.lua
msgid "Bottle of Hemp Oil"
msgstr "Garrafa de Oleo de Canhamo"
#: hemp.lua
msgid "Hemp Fibre"
msgstr "Fibra de Canhamo"
#: hemp.lua
msgid "Hemp Rope"
msgstr "Corda de Canhamo"
#: hoes.lua
msgid "Wooden Hoe"
msgstr "Enxada de Madeira"
#: hoes.lua
msgid "Stone Hoe"
msgstr "Enxada de Pedra"
#: hoes.lua
msgid "Steel Hoe"
msgstr "Enxada de Aço"
#: hoes.lua
msgid "Bronze Hoe"
msgstr "Enxada de Bronze"
#: hoes.lua
msgid "Mese Hoe"
msgstr "Enxada de Mese"
#: hoes.lua
msgid "Diamond Hoe"
msgstr "Enxada de Diamante"
#: init.lua
msgid "Seed"
msgstr "Sementes"
#: melon.lua
msgid "Melon Slice"
msgstr "Sementes de Melancia"
#: melon.lua
msgid "Melon"
msgstr "Melancia"
#: potato.lua
msgid "Potato"
msgstr "Batata"
#: potato.lua
msgid "Baked Potato"
msgstr "Batata Cozida"
#: pumpkin.lua
msgid "Pumpkin"
msgstr "Abobora"
#: pumpkin.lua
msgid "Pumpkin Slice"
msgstr "Pedaço de Abobora"
#: pumpkin.lua
msgid "Jack 'O Lantern (punch to turn on and off)"
msgstr "Jack 'O Lantern (Socos para ligar e desligar)"
#: pumpkin.lua
msgid "Pumpkin Bread"
msgstr "Pao de Abobora"
#: pumpkin.lua
msgid "Pumpkin Dough"
msgstr "Massa de Abobora"
#: raspberry.lua
msgid "Raspberries"
msgstr "Framboesa"
#: raspberry.lua
msgid "Raspberry Smoothie"
msgstr "Batida de Framboesa"
#: rhubarb.lua
msgid "Rhubarb"
msgstr "Ruibarbo"
#: rhubarb.lua
msgid "Rhubarb Pie"
msgstr "Torta de Ruibarbo"
#: soil.lua
msgid "Soil"
msgstr "Solo"
#: soil.lua
msgid "Wet Soil"
msgstr "Solo Seco"
#: sugar.lua
msgid "Sugar"
msgstr "Açucar"
#: tomato.lua
msgid "Tomato"
msgstr "Tomate"
#: wheat.lua
msgid "Wheat Seed"
msgstr "Sementes de Trigo"
#: wheat.lua
msgid "Wheat"
msgstr "Trigo"
#: wheat.lua
msgid "Straw"
msgstr "Palha"
#: wheat.lua
msgid "Flour"
msgstr "Farinha"
#: wheat.lua
msgid "Bread"
msgstr "Pao"

258
farming/locale/template.pot Normal file
View File

@ -0,0 +1,258 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-16 17:38-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: barley.lua
msgid "Barley Seed"
msgstr ""
#: barley.lua
msgid "Barley"
msgstr ""
#: beanpole.lua
msgid "Green Beans"
msgstr ""
#: beanpole.lua
msgid "Bean Pole (place on soil before planting beans)"
msgstr ""
#: blueberry.lua
msgid "Blueberries"
msgstr ""
#: blueberry.lua
msgid "Blueberry Muffin"
msgstr ""
#: carrot.lua
msgid "Carrot"
msgstr ""
#: carrot.lua
msgid "Golden Carrot"
msgstr ""
#: cocoa.lua
msgid "Cocoa Beans"
msgstr ""
#: cocoa.lua
msgid "Cookie"
msgstr ""
#: cocoa.lua
msgid "Bar of Dark Chocolate"
msgstr ""
#: coffee.lua
msgid "Coffee Beans"
msgstr ""
#: coffee.lua
msgid "Drinking Cup (empty)"
msgstr ""
#: coffee.lua
msgid "Cold Cup of Coffee"
msgstr ""
#: coffee.lua
msgid "Hot Cup of Coffee"
msgstr ""
#: corn.lua
msgid "Corn"
msgstr ""
#: corn.lua
msgid "Corn on the Cob"
msgstr ""
#: corn.lua
msgid "Bottle of Ethanol"
msgstr ""
#: cotton.lua
msgid "Cotton Seed"
msgstr ""
#: cotton.lua
msgid "Cotton"
msgstr ""
#: cucumber.lua
msgid "Cucumber"
msgstr ""
#: donut.lua
msgid "Donut"
msgstr ""
#: donut.lua
msgid "Chocolate Donut"
msgstr ""
#: donut.lua
msgid "Apple Donut"
msgstr ""
#: grapes.lua
msgid "Grapes"
msgstr ""
#: grapes.lua
msgid "Trellis (place on soil before planting grapes)"
msgstr ""
#: hemp.lua
msgid "Hemp Seed"
msgstr ""
#: hemp.lua
msgid "Hemp Leaf"
msgstr ""
#: hemp.lua
msgid "Bottle of Hemp Oil"
msgstr ""
#: hemp.lua
msgid "Hemp Fibre"
msgstr ""
#: hemp.lua
msgid "Hemp Rope"
msgstr ""
#: hoes.lua
msgid "Wooden Hoe"
msgstr ""
#: hoes.lua
msgid "Stone Hoe"
msgstr ""
#: hoes.lua
msgid "Steel Hoe"
msgstr ""
#: hoes.lua
msgid "Bronze Hoe"
msgstr ""
#: hoes.lua
msgid "Mese Hoe"
msgstr ""
#: hoes.lua
msgid "Diamond Hoe"
msgstr ""
#: init.lua
msgid "Seed"
msgstr ""
#: melon.lua
msgid "Melon Slice"
msgstr ""
#: melon.lua
msgid "Melon"
msgstr ""
#: potato.lua
msgid "Potato"
msgstr ""
#: potato.lua
msgid "Baked Potato"
msgstr ""
#: pumpkin.lua
msgid "Pumpkin"
msgstr ""
#: pumpkin.lua
msgid "Pumpkin Slice"
msgstr ""
#: pumpkin.lua
msgid "Jack 'O Lantern (punch to turn on and off)"
msgstr ""
#: pumpkin.lua
msgid "Pumpkin Bread"
msgstr ""
#: pumpkin.lua
msgid "Pumpkin Dough"
msgstr ""
#: raspberry.lua
msgid "Raspberries"
msgstr ""
#: raspberry.lua
msgid "Raspberry Smoothie"
msgstr ""
#: rhubarb.lua
msgid "Rhubarb"
msgstr ""
#: rhubarb.lua
msgid "Rhubarb Pie"
msgstr ""
#: soil.lua
msgid "Soil"
msgstr ""
#: soil.lua
msgid "Wet Soil"
msgstr ""
#: sugar.lua
msgid "Sugar"
msgstr ""
#: tomato.lua
msgid "Tomato"
msgstr ""
#: wheat.lua
msgid "Wheat Seed"
msgstr ""
#: wheat.lua
msgid "Wheat"
msgstr ""
#: wheat.lua
msgid "Straw"
msgstr ""
#: wheat.lua
msgid "Flour"
msgstr ""
#: wheat.lua
msgid "Bread"
msgstr ""

View File

@ -15,5 +15,7 @@ if minetest.get_modpath("lucky_block") then
{"nod", "farming:melon", 0},
{"dro", {"farming:donut", "farming:donut_chocolate", "farming:donut_apple"}, 5},
{"dro", {"farming:hemp_leaf", "farming:hemp_fibre", "farming:seed_hemp"}, 5},
{"nod", "fire:permanent_flame", 1},
{"dro", {"farming:chili_pepper", "farming:chili_bowl"}, 5},
})
end

View File

@ -12,7 +12,7 @@ local function register_plant(name, min, max, spawnby, num, enabled)
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.006,
scale = farming.rarety, -- 0.006,
spread = {x = 100, y = 100, z = 100},
seed = 329,
octaves = 3,
@ -60,7 +60,7 @@ minetest.register_decoration({
sidelen = 16,
noise_params = {
offset = 0,
scale = 0.06,
scale = farming.rarety, -- 0.06,
spread = {x = 100, y = 100, z = 100},
seed = 420,
octaves = 3,
@ -73,3 +73,24 @@ minetest.register_decoration({
num_spawn_by = 1,
})
end
if farming.chili then
minetest.register_decoration({
deco_type = "simple",
place_on = {"default:dirt_with_grass", "default:dirt_with_rainforest_litter"},
sidelen = 16,
noise_params = {
offset = 0,
scale = farming.rarety, -- 0.06,
spread = {x = 100, y = 100, z = 100},
seed = 760,
octaves = 3,
persist = 0.6
},
y_min = 5,
y_max = 35,
decoration = {"farming:chili_8"},
spawn_by = "group:tree",
num_spawn_by = 1,
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

View File

@ -8,7 +8,7 @@ minetest.register_node("farming:seed_wheat", {
inventory_image = "farming_wheat_seed.png",
wield_image = "farming_wheat_seed.png",
drawtype = "signlike",
groups = {seed = 1, snappy = 3, attached_node = 1},
groups = {seed = 1, snappy = 3, attached_node = 1, flammable = 4},
paramtype = "light",
paramtype2 = "wallmounted",
walkable = false,
@ -23,6 +23,7 @@ minetest.register_node("farming:seed_wheat", {
minetest.register_craftitem("farming:wheat", {
description = S("Wheat"),
inventory_image = "farming_wheat.png",
groups = {flammable = 4},
})
-- straw
@ -30,7 +31,7 @@ minetest.register_node("farming:straw", {
description = S("Straw"),
tiles = {"farming_straw.png"},
is_ground_content = false,
groups = {snappy = 3, flammable = 4},
groups = {snappy = 3, flammable = 4, fall_damage_add_percent = -30},
sounds = default.node_sound_leaves_defaults(),
})
@ -54,6 +55,7 @@ minetest.register_craft({
minetest.register_craftitem("farming:flour", {
description = S("Flour"),
inventory_image = "farming_flour.png",
groups = {flammable = 1},
})
minetest.register_craft({
@ -67,6 +69,7 @@ minetest.register_craftitem("farming:bread", {
description = S("Bread"),
inventory_image = "farming_bread.png",
on_use = minetest.item_eat(5),
groups = {flammable = 2},
})
minetest.register_craft({
@ -81,13 +84,15 @@ local crop_def = {
drawtype = "plantlike",
tiles = {"farming_wheat_1.png"},
paramtype = "light",
paramtype2 = "meshoptions",
place_param2 = 3,
sunlight_propagates = true,
walkable = false,
buildable_to = true,
drop = "",
selection_box = farming.select,
groups = {
snappy = 3, flammable = 2, plant = 1, attached_node = 1,
snappy = 3, flammable = 4, plant = 1, attached_node = 1,
not_in_creative_inventory = 1, growing = 1
},
sounds = default.node_sound_leaves_defaults()
@ -152,3 +157,16 @@ crop_def.drop = {
}
}
minetest.register_node("farming:wheat_8", table.copy(crop_def))
-- fuels
minetest.register_craft({
type = "fuel",
recipe = "farming:straw",
burntime = 3,
})
minetest.register_craft({
type = "fuel",
recipe = "farming:wheat",
burntime = 1,
})

View File

@ -39,7 +39,7 @@ minetest.register_craft({
})
minetest.register_node("framedglass:wooden_framed_glass", {
description = "Wooden-framed Glass",
description = "Деревянное окно",
drawtype = "glasslike_framed",
tiles = {"framedglass_wooden_frame.png","framedglass_glass_face_streaks.png"},
paramtype = "light",
@ -49,7 +49,7 @@ minetest.register_node("framedglass:wooden_framed_glass", {
})
minetest.register_node("framedglass:steel_framed_glass", {
description = "Steel-framed Glass",
description = "Стальное окно",
drawtype = "glasslike_framed",
tiles = {"framedglass_steel_frame.png","framedglass_glass_face_streaks.png"},
paramtype = "light",
@ -59,7 +59,7 @@ minetest.register_node("framedglass:steel_framed_glass", {
})
minetest.register_node("framedglass:wooden_framed_obsidian_glass", {
description = "Wooden-framed Obsidian Glass",
description = "Деревянное окно с обсидиановым стеклом",
drawtype = "glasslike_framed",
tiles = {"framedglass_wooden_frame.png","framedglass_glass_face_clean.png"},
paramtype = "light",
@ -164,7 +164,7 @@ local return_dye_after_dig = function(pos, oldnode, oldmetadata, digger)
end
minetest.register_node("framedglass:steel_framed_obsidian_glass", {
description = "Steel-framed Obsidian Glass",
description = "Стальное окно с обсидиановым стеклом",
drawtype = "glasslike_framed",
tiles = {"framedglass_steel_frame.png","framedglass_glass_face_clean.png"},
paramtype = "light",
@ -177,7 +177,7 @@ minetest.register_node("framedglass:steel_framed_obsidian_glass", {
function add_coloured_framedglass(name, desc, color)
minetest.register_node( "framedglass:steel_framed_obsidian_glass"..name, {
description = "Steel-framed "..desc.." Obsidian Glass",
description = "Стальное окно с "..desc.." обсидиановым стеклом",
tiles = {
"framedglass_steel_frame.png",
{ name = "framedglass_whiteglass.png", color = color }
@ -195,20 +195,20 @@ function add_coloured_framedglass(name, desc, color)
})
end
add_coloured_framedglass ("red", "Red", 0xffff0000)
add_coloured_framedglass ("orange", "Orange", 0xfffe7f00)
add_coloured_framedglass ("yellow", "Yellow", 0xffffff01)
add_coloured_framedglass ("green", "Green", 0xff0cff00)
add_coloured_framedglass ("cyan", "Cyan", 0xff7affff)
add_coloured_framedglass ("blue", "Blue", 0xff1600ff)
add_coloured_framedglass ("violet", "Violet", 0xff7d00ff)
add_coloured_framedglass ("magenta", "Magenta", 0xfffd05ff)
add_coloured_framedglass ("red", "красным", 0xffff0000)
add_coloured_framedglass ("orange", "оранжевым", 0xfffe7f00)
add_coloured_framedglass ("yellow", "жёлтым", 0xffffff01)
add_coloured_framedglass ("green", "зелёным", 0xff0cff00)
add_coloured_framedglass ("cyan", "голубым", 0xff7affff)
add_coloured_framedglass ("blue", "синим", 0xff1600ff)
add_coloured_framedglass ("violet", "фиолетовым", 0xff7d00ff)
add_coloured_framedglass ("magenta", "пурпурным", 0xfffd05ff)
add_coloured_framedglass ("darkgreen", "Dark Green", 0xff144f00)
add_coloured_framedglass ("pink", "Pink", 0xffffa4a4)
add_coloured_framedglass ("brown", "Brown", 0xff542a00)
add_coloured_framedglass ("darkgreen", "тёмно-зелёным", 0xff144f00)
add_coloured_framedglass ("pink", "розовым", 0xffffa4a4)
add_coloured_framedglass ("brown", "коричневым", 0xff542a00)
add_coloured_framedglass ("white", "White", 0xffffffff)
add_coloured_framedglass ("grey", "Grey", 0xff7f817e)
add_coloured_framedglass ("darkgrey", "Dark Grey", 0xff3f403e)
add_coloured_framedglass ("black", "Black", 0xff000000)
add_coloured_framedglass ("white", "белым", 0xffffffff)
add_coloured_framedglass ("grey", "серым", 0xff7f817e)
add_coloured_framedglass ("darkgrey", "тёмно-серым", 0xff3f403e)
add_coloured_framedglass ("black", "чёрным", 0xff000000)

176
gloopblocks/locale/ru.po Normal file
View File

@ -0,0 +1,176 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-14 06:45+0200\n"
"PO-Revision-Date: 2017-08-17 12:47+0300\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n"
"Last-Translator: inpos <inpos@yandex.ru>\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"Language: ru\n"
msgid "Diagonal Rainbow Block"
msgstr "Блок с радугой по диагонали"
msgid "Horizontal Rainbow Block"
msgstr "Блок с радугой по горизонтали"
msgid "Cement"
msgstr "Цемент"
msgid "Evil Block"
msgstr "Злой блок"
msgid "Basalt"
msgstr "Базальт"
msgid "Pumice"
msgstr "Пемза"
msgid "Pavement"
msgstr "Мостовая"
msgid "Oerkki Block"
msgstr "Блок Оеркки"
msgid "Mossy Stone Brick"
msgstr "Кирпич из мшистого камня"
msgid "Mossy Stone"
msgstr "Мшистый камень"
msgid "Cobblestone Road Bed"
msgstr "Брусчатка"
msgid "Mossy Cobblestone Road Bed"
msgstr "Мшистая брусчатка"
msgid "Wooden Scaffold"
msgstr "Деревянные строительные леса"
msgid "Cobblestone Roadbed"
msgstr "Брусчатка"
msgid "Mossy Cobblestone Roadbed"
msgstr "Мшистая брусчатка"
msgid "Rainbow Block"
msgstr "Радужный блок"
msgid "Glow Crystal"
msgstr "Светящийся хрусталь"
msgid "Glow Emerald"
msgstr "Светящийся изумруд"
msgid "Glow Mese"
msgstr "Светящийся камень"
msgid "Mossy Stone Stair"
msgstr "Ступенька из мшистого камня"
msgid "Mossy Stone Slab"
msgstr "Плита из мшистого камня"
msgid "Mossy Cobble Stair"
msgstr "Ступенька из мшистого булыжника"
msgid "Mossy Cobble Slab"
msgstr "Плита из мшистого булыжника"
msgid "Mossy Stone Brick Stair"
msgstr "Ступенька из мшистого каменного кирпича"
msgid "Mossy Stone Brick Slab"
msgstr "Плита из мшистого каменного кирпича"
msgid "Cobble Roadbed Stair"
msgstr "Ступенька из брусчатки"
msgid "Cobble Roadbed Slab"
msgstr "Плита из брусчатки"
msgid "Mossy Cobble Roadbed Stair"
msgstr "Ступенька из мшистой брусчатки"
msgid "Mossy Cobble Roadbed Slab"
msgstr "Плита из мшистой брусчатки"
msgid "Cement Stair"
msgstr "Ступенька из цемента"
msgid "Cement Slab"
msgstr "Плита из цемента"
msgid "Pavement Stair"
msgstr "Ступенька из мостовой"
msgid "Pavement Slab"
msgstr "Плита из мостовой"
msgid "Basalt Stair"
msgstr "Базальтовая ступенька"
msgid "Basalt Slab"
msgstr "Базальтовая плита"
msgid "Pumice Stair"
msgstr "Ступенька из пемзы"
msgid "Pumice Slab"
msgstr "Плита из пемзы"
msgid "Rainbow Block Stair"
msgstr "Ступенька из радужного блока"
msgid "Rainbow Block Slab"
msgstr "Плита из радужного блока"
msgid "Cement Pickaxe"
msgstr "Кирка из цемента"
msgid "Cement Shovel"
msgstr "Лопата из цемента"
msgid "Cement Axe"
msgstr "Топор из цемента"
msgid "Cement Sword"
msgstr "Меч из цемента"
msgid "Evil Pickaxe"
msgstr "Кирка зла"
msgid "Evil Shovel"
msgstr "Лопата зла"
msgid "Evil Axe"
msgstr "Топор зла"
msgid "Evil Sword"
msgstr "Меч зла"
msgid "Wet Cement"
msgstr "Мокрый цемент"
msgid "Evil Stick"
msgstr "Злая палка"
msgid "Obsidian"
msgstr "Обсидиан"
msgid "Steel Fence"
msgstr "Стальной забор"
msgid "Gloopblocks Loaded!"
msgstr "Gloopblocks загружен!"

View File

@ -118,7 +118,7 @@ minetest.register_alias("homedecor:deckchair_head", "air")
homedecor.register("deckchair_striped_blue", {
mesh = "homedecor_deckchair.obj",
tiles = {"homedecor_deckchair_striped_blue.png"},
description = S("Deck Chair"),
description = S("Deck Chair (blue striped)"),
groups = { snappy = 3 },
expand = { forward="placeholder" },
sounds = default.node_sound_wood_defaults(),
@ -368,7 +368,7 @@ local shrub_cbox = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
for _, color in ipairs(homedecor.shrub_colors) do
minetest.register_node("homedecor:shrubbery_large_"..color, {
description = S("Shrubbery (@1)", S(color)),
description = S("Shrubbery (large, @1)", S(color)),
drawtype = "mesh",
mesh = "homedecor_cube.obj",
tiles = {"homedecor_shrubbery_"..color..".png"},

View File

@ -368,14 +368,6 @@ function homedecor.place_banister(itemstack, placer, pointed_thing)
fdir = right_fwd_node.param2
pos = fwd_pos
new_place_name = string.gsub(right_fwd_node.name, "_diagonal_.-$", "_horizontal")
-- try to follow a horizontal with another of the same
elseif left_node and string.find(left_node.name, "homedecor:banister_.*_horizontal") then
fdir = left_node.param2
new_place_name = left_node.name
elseif right_node and string.find(right_node.name, "homedecor:banister_.*_horizontal") then
fdir = right_node.param2
new_place_name = right_node.name
end
-- manually invert left-right orientation

View File

@ -129,7 +129,7 @@ minetest.register_node("homedecor:curtain_closed", {
})
minetest.register_node("homedecor:curtain_open", {
description = S("Curtains"),
description = S("Curtains (open)"),
tiles = { "homedecor_curtain_open.png" },
inventory_image = "homedecor_curtain_open.png",
drawtype = 'signlike',

View File

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-03 20:37+0200\n"
"PO-Revision-Date: 2017-07-30 17:09+0200\n"
"PO-Revision-Date: 2017-08-13 13:26+0200\n"
"Last-Translator: Wuzzy <almikes@aol.com>\n"
"Language-Team: German\n"
"Language: de\n"
@ -73,18 +73,16 @@ msgid "Marble"
msgstr "Marmor"
#: ../building_blocks/init.lua
#, fuzzy
msgid "Grass"
msgstr "Messing"
msgstr "Gras"
#: ../building_blocks/init.lua
msgid "Tar"
msgstr "Teer"
#: ../building_blocks/init.lua
#, fuzzy
msgid "Roofing"
msgstr "Dachstufe"
msgstr "Dachdeckung"
#: ../building_blocks/init.lua
msgid "Marble stair"
@ -220,23 +218,23 @@ msgstr "Unverarbeiteter Kunststoff"
#: ../computer/tetris.lua
msgid "L"
msgstr ""
msgstr "L"
#: ../computer/tetris.lua
msgid "R"
msgstr ""
msgstr "R"
#: ../computer/tetris.lua
msgid "New Game"
msgstr "Neuese Spiel"
msgstr "Neues Spiel"
#: ../computer/tetris.lua
msgid "Next..."
msgstr ""
msgstr "Nächster …"
#: ../computer/tetris.lua
msgid "Score: "
msgstr ""
msgstr "Punktzahl: "
#: ../computer/tetris.lua
msgid "Tetris Arcade"
@ -328,11 +326,11 @@ msgstr "Duschbrause"
#: ../homedecor/bathroom_sanitation.lua
msgid "Bathtub, clawfoot, with brass taps"
msgstr ""
msgstr "Badewanne, Krallenfuß, mit Messingwasserhähnen"
#: ../homedecor/bathroom_sanitation.lua
msgid "Bathtub, clawfoot, with chrome taps"
msgstr ""
msgstr "Badewanne, Krallenfuß, mit Chromwasserhähnen"
#: ../homedecor/bathroom_sanitation.lua
msgid "Bathroom sundries set"
@ -371,8 +369,8 @@ msgid "Two-drawer Nightstand"
msgstr "Nachttisch mit zwei Schubladen"
#: ../homedecor/books.lua
msgid "Writable Book"
msgstr "Schreibbares Buch"
msgid "Writable Book (@1)"
msgstr "Schreibbares Buch (@1)"
#: ../homedecor/books.lua
msgid "@1 has written in a book (title: \"@2\"): \"@3\" at location @4"
@ -600,11 +598,11 @@ msgstr "Maschendrahtzauntor"
#: ../homedecor/doors_and_gates.lua
msgid "\"Half\" Door"
msgstr ""
msgstr "„Halbe“ Tür"
#: ../homedecor/doors_and_gates.lua
msgid "\"Half\" Door (white)"
msgstr ""
msgstr "„Halbe“ Tür (weiß)"
#: ../homedecor/doors_and_gates.lua
msgid "Japanese wall (top)"
@ -1296,8 +1294,12 @@ msgid "Metal tool cabinet and work table"
msgstr "Metallwerkzeugschrank und Arbeitstisch"
#: ../homedecor/misc-nodes.lua
msgid "Picture Frame"
msgstr "Bilderrahmen"
msgid "Picture Frame 1"
msgstr "Bilderrahmen 1"
#: ../homedecor/misc-nodes.lua
msgid "Picture Frame 2"
msgstr "Bilderrahmen 2"
#: ../homedecor/misc-nodes.lua
msgid "Decorative painting #@1"
@ -1305,7 +1307,7 @@ msgstr "Dekoratives Gemälde Nr. @1"
#: ../homedecor/misc-nodes.lua
msgid "dark topped"
msgstr "dunkle Oberseite"
msgstr "dunkler Handlauf"
#: ../homedecor/misc-nodes.lua
msgid "diagonal"
@ -1540,19 +1542,16 @@ msgid "End Table"
msgstr "Beitisch"
#: ../lrfurn/init.lua
#, fuzzy
msgid "Someone else owns the spot where other end goes!"
msgstr "Jemanden gehört schon der Platz, wo das Kopfende hingehen würde."
msgstr "Jemanden gehört schon die Stelle, wo das andere Ende hingehen würde."
#: ../lrfurn/init.lua
#, fuzzy
msgid "Someone else owns the spot where the middle or far end goes!"
msgstr "Jemanden gehört schon der Platz, wo das Kopfende hingehen würde."
msgstr "Jemanden gehört schon die Stelle, wo das mittlere oder ferne Stück hingehen würde."
#: ../lrfurn/init.lua
#, fuzzy
msgid "Someone else owns the spot where the other end goes!"
msgstr "Jemanden gehört schon der Platz, wo das Kopfende hingehen würde."
msgstr "Jemanden gehört schon die Stelle, wo das andere Ende hingehen würde."
#: ../lrfurn/longsofas.lua
msgid "Long Sofa"
@ -1578,8 +1577,23 @@ msgstr "Plasmafernseher"
msgid "Plasma TV (off)"
msgstr "Plasmafernseher (aus)"
#~ msgid "blue"
#~ msgstr "blau"
msgid "Tumble dryer"
msgstr "Wäschetrockner"
msgid "Ironing board"
msgstr "Bügelbrett"
msgid "Spiral Staircase"
msgstr "Wendeltreppe"
msgid "Washing Machine"
msgstr "Waschmaschine"
msgid "blue"
msgstr "blau"
msgid "brown"
msgstr "braun"
#~ msgid "white"
#~ msgstr "weiß"
@ -1587,8 +1601,11 @@ msgstr "Plasmafernseher (aus)"
#~ msgid "pink"
#~ msgstr "rosa"
#~ msgid "violet"
#~ msgstr "violett"
msgid "violet"
msgstr "violett"
msgid "grey"
msgstr "grau"
#~ msgid "dark green"
#~ msgstr "dunkelgrün"
@ -1639,8 +1656,7 @@ msgstr "Plasmafernseher (aus)"
#~ msgstr "%s nimmt etwas aus dem Kuechenschrank bei %s"
#~ msgid "Not enough space above that spot to place a door! "
#~ msgstr ""
#~ "Es gibt nicht genug Raum ueber dieser Stelle um die Tuer zu platzieren!"
#~ msgstr "Es gibt nicht genug Raum ueber dieser Stelle um die Tuer zu platzieren!"
#~ msgid "Bucket of white paint "
#~ msgstr "Eimer mit weisser Farbe"

1576
homedecor_i18n/locale/ru.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,12 +4,13 @@
mesecon.button_turnoff = function (pos)
local node = minetest.get_node(pos)
if node.name=="mesecons_button:button_on" then --has not been dug
minetest.swap_node(pos, {name = "mesecons_button:button_off", param2=node.param2})
minetest.sound_play("mesecons_button_pop", {pos=pos})
local rules = mesecon.rules.buttonlike_get(node)
mesecon.receptor_off(pos, rules)
if node.name ~= "mesecons_button:button_on" then -- has been dug
return
end
minetest.swap_node(pos, {name = "mesecons_button:button_off", param2 = node.param2})
minetest.sound_play("mesecons_button_pop", {pos = pos})
local rules = mesecon.rules.buttonlike_get(node)
mesecon.receptor_off(pos, rules)
end
minetest.register_node("mesecons_button:button_off", {
@ -45,7 +46,7 @@ minetest.register_node("mesecons_button:button_off", {
minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2})
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
minetest.sound_play("mesecons_button_push", {pos=pos})
minetest.after(1, mesecon.button_turnoff, pos)
minetest.get_node_timer(pos):start(1)
end,
sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = {
@ -89,7 +90,8 @@ minetest.register_node("mesecons_button:button_on", {
mesecons = {receptor = {
state = mesecon.state.on,
rules = mesecon.rules.buttonlike_get
}}
}},
on_timer = mesecon.button_turnoff,
})
minetest.register_craft({

View File

@ -61,3 +61,9 @@ mesecon.lightstone_add("blue", "dye:blue", "jeija_lightstone_blue_off.png", "jei
mesecon.lightstone_add("gray", "dye:grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png", "Grey Lightstone")
mesecon.lightstone_add("darkgray", "dye:dark_grey", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png", "Dark Grey Lightstone")
mesecon.lightstone_add("yellow", "dye:yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png", "Yellow Lightstone")
mesecon.lightstone_add("orange", "dye:orange", "jeija_lightstone_orange_off.png", "jeija_lightstone_orange_on.png", "Orange Lightstone")
mesecon.lightstone_add("white", "dye:white", "jeija_lightstone_white_off.png", "jeija_lightstone_white_on.png", "White Lightstone")
mesecon.lightstone_add("pink", "dye:pink", "jeija_lightstone_pink_off.png", "jeija_lightstone_pink_on.png", "Pink Lightstone")
mesecon.lightstone_add("magenta", "dye:magenta", "jeija_lightstone_magenta_off.png", "jeija_lightstone_magenta_on.png", "Magenta Lightstone")
mesecon.lightstone_add("cyan", "dye:cyan", "jeija_lightstone_cyan_off.png", "jeija_lightstone_cyan_on.png", "Cyan Lightstone")
mesecon.lightstone_add("violet", "dye:violet", "jeija_lightstone_violet_off.png", "jeija_lightstone_violet_on.png", "Violet Lightstone")

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

View File

@ -144,14 +144,27 @@ end
end
end
minetest.register_craft({
output = 'craft "mesecons_microcontroller:microcontroller0000" 2',
recipe = {
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
}
})
if minetest.get_modpath("mesecons_luacontroller") then
minetest.register_craft({
type = "shapeless",
output = "mesecons_microcontroller:microcontroller0000",
recipe = {"mesecons_luacontroller:luacontroller0000"},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_luacontroller:luacontroller0000",
recipe = {"mesecons_microcontroller:microcontroller0000"},
})
else
minetest.register_craft({
output = 'craft "mesecons_microcontroller:microcontroller0000" 2',
recipe = {
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
}
})
end
yc.reset = function(pos)
yc.action(pos, {a=false, b=false, c=false, d=false})

View File

@ -165,6 +165,10 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
-- remove all nodes
for _, n in ipairs(nodes) do
n.meta = minetest.get_meta(n.pos):to_table()
local node_timer = minetest.get_node_timer(n.pos)
if node_timer:is_started() then
n.node_timer = {node_timer:get_timeout(), node_timer:get_elapsed()}
end
minetest.remove_node(n.pos)
end
@ -179,6 +183,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
minetest.set_node(np, n.node)
minetest.get_meta(np):from_table(n.meta)
if n.node_timer then
minetest.get_node_timer(np):set(unpack(n.node_timer))
end
end
local moved_nodes = {}
@ -190,6 +197,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
moved_nodes[i].pos = nodes[i].pos
moved_nodes[i].node = nodes[i].node
moved_nodes[i].meta = nodes[i].meta
moved_nodes[i].node_timer = nodes[i].node_timer
end
on_mvps_move(moved_nodes)

View File

@ -213,7 +213,8 @@ local function register_wires()
node_box = nodebox,
walkable = false,
drop = "mesecons:wire_00000000_off",
mesecon_wire = true
mesecon_wire = true,
on_rotate = false,
}, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off},
{tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on})

View File

@ -1,7 +1,7 @@
--[[
More Blocks: circular saw
Copyright (c) 2011-2017 Hugo Locurcio and contributors.
Copyright (c) 2011-2017 Hugo Locurcio, Sokomine and contributors.
Licensed under the zlib license. See LICENSE.md for more information.
--]]

View File

@ -8,7 +8,7 @@ Licensed under the zlib license. See LICENSE.md for more information.
moreblocks.config = {}
local function getbool_default(setting, default)
local value = minetest.setting_getbool(setting)
local value = minetest.settings:get_bool(setting)
if value == nil then
value = default
end
@ -21,7 +21,7 @@ local function setting(settingtype, name, default)
getbool_default("moreblocks." .. name, default)
else
moreblocks.config[name] =
minetest.setting_get("moreblocks." .. name) or default
minetest.settings:get("moreblocks." .. name) or default
end
end

View File

@ -454,7 +454,7 @@ minetest.register_craft({
}
})
if minetest.setting_getbool("moreblocks.circular_saw_crafting") ~= false then -- “If nil or true then”
if minetest.settings:get_bool("moreblocks.circular_saw_crafting") ~= false then -- “If nil or true then”
minetest.register_craft({
output = "moreblocks:circular_saw",
recipe = {

View File

@ -11,8 +11,12 @@ Licensed under the zlib license. See LICENSE.md for more information.
moreblocks = {}
local S
if minetest.get_modpath("intllib") then
S = intllib.Getter()
if minetest.global_exists("intllib") then
if intllib.make_gettext_pair then
S = intllib.make_gettext_pair()
else
S = intllib.Getter()
end
else
S = function(s) return s end
end
@ -28,6 +32,6 @@ dofile(modpath .. "/redefinitions.lua")
dofile(modpath .. "/crafting.lua")
dofile(modpath .. "/aliases.lua")
if minetest.setting_getbool("log_mods") then
if minetest.settings:get_bool("log_mods") then
minetest.log("action", S("[moreblocks] loaded."))
end

View File

@ -15,7 +15,7 @@ stairsplus.expect_infinite_stacks = false
stairsplus.shapes_list = {}
if not minetest.get_modpath("unified_inventory")
and minetest.setting_getbool("creative_mode") then
and minetest.settings:get_bool("creative_mode") then
stairsplus.expect_infinite_stacks = true
end

View File

@ -17,6 +17,7 @@ local default_nodes = { -- Default stairs/slabs/panels/microblocks:
"copperblock",
"bronzeblock",
"diamondblock",
"tinblock",
"desert_stone",
"desert_stone_block",
"desert_cobble",
@ -39,6 +40,12 @@ local default_nodes = { -- Default stairs/slabs/panels/microblocks:
"stonebrick",
"desert_stonebrick",
"sandstonebrick",
"silver_sandstone",
"silver_sandstone_brick",
"silver_sandstone_block",
"desert_sandstone",
"desert_sandstone_brick",
"desert_sandstone_block",
"sandstone_block",
"coral_skeleton",
"farming:straw"

View File

@ -500,3 +500,194 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice
That's all there is to it!
--------------------------------------------------------------------------------
Some code in lua_tube.lua is copied from The Mesecons Mod for Minetest:
License of source code
----------------------
Copyright (C) 2011-2016 Mesecons Mod Developer Team and contributors
This program is free software; you can redistribute the Mesecons Mod and/or
modify it under the terms of the GNU Lesser General Public License version 3
published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301, USA.
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@ -36,7 +36,7 @@ local function get_chest_formspec(pos)
pipeworks.button_on
}
)..pipeworks.button_label
return formspec
end
@ -62,7 +62,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local sound = open_chests[pn].sound
local swap = open_chests[pn].swap
local node = minetest.get_node(pos)
open_chests[pn] = nil
for k, v in pairs(open_chests) do
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
@ -71,13 +71,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
minetest.after(0.2, function()
minetest.swap_node(pos, { name = "default:" .. swap, param2 = node.param2 })
-- Pipeworks notification
pipeworks.after_place(pos)
end)
minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10})
end
-- Pipeworks Switch
if pipeworks.may_configure(pos, player) and not fields.quit then
fs_helpers.on_receive_fields(pos, fields)
@ -142,6 +142,7 @@ override_protected = {
end
return inv:room_for_item("main", stack)
end,
input_inventory = "main",
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
},
after_dig_node = pipeworks.after_dig
@ -191,9 +192,9 @@ override = {
after_dig_node = pipeworks.after_dig
}
--[[local override_common = {
}
for k,v in pairs(override_common) do
for k,v in pairs(override_common) do
override_protected[k] = v
override[k] = v
end]]

View File

@ -15,12 +15,14 @@ local settings = {
enable_detector_tube = true,
enable_digiline_detector_tube = true,
enable_conductor_tube = true,
enable_digiline_conductor_tube = true,
enable_accelerator_tube = true,
enable_crossing_tube = true,
enable_sand_tube = true,
enable_mese_sand_tube = true,
enable_one_way_tube = true,
enable_priority_tube = true,
enable_lua_tube = true,
enable_cyclic_mode = true,
drop_on_routing_fail = false,

View File

@ -156,7 +156,7 @@ local function grabAndFire(data,slotseq_mode,exmatch_mode,filtmeta,frominv,fromi
end
local pos = vector.add(frompos, vector.multiply(dir, 1.4))
local start_pos = vector.add(frompos, dir)
local item1 = pipeworks.tube_inject_item(pos, start_pos, dir, item)
local item1 = pipeworks.tube_inject_item(pos, start_pos, dir, item, fakePlayer:get_player_name())
return true-- only fire one item, please
end
end
@ -219,7 +219,7 @@ local function punch_filter(data, filtpos, filtnode, msg)
local filters = {}
if data.digiline then
local function add_filter(name, group, count, wear, metadata)
table.insert(filters, {name = name, group = group, count = count, wear = wear, metadata = metadata})
table.insert(filters, {name = name, group = group, count = tonumber(count), wear = wear, metadata = metadata})
end
local function add_itemstring_filter(filter)
@ -317,8 +317,16 @@ local function punch_filter(data, filtpos, filtnode, msg)
exact_match = filtmeta:get_int("exmatch_mode")
end
local frommeta = minetest.get_meta(frompos)
local frominv = frommeta:get_inventory()
local frominv
if fromtube.return_input_invref then
frominv = fromtube.return_input_invref(frompos, fromnode, dir, owner)
if not frominv then
return
end
else
local frommeta = minetest.get_meta(frompos)
frominv = frommeta:get_inventory()
end
if fromtube.before_filter then fromtube.before_filter(frompos) end
for _, frominvname in ipairs(type(fromtube.input_inventory) == "table" and fromtube.input_inventory or {fromtube.input_inventory}) do
local done = false
@ -378,12 +386,22 @@ for _, data in ipairs({
end,
after_dig_node = pipeworks.after_dig,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if not pipeworks.may_configure(pos, player) then return 0 end
return stack:get_count()
if not pipeworks.may_configure(pos, player) then
return 0
end
local inv = minetest.get_meta(pos):get_inventory()
inv:set_stack("main", index, stack)
return 0
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if not pipeworks.may_configure(pos, player) then return 0 end
return stack:get_count()
if not pipeworks.may_configure(pos, player) then
return 0
end
local inv = minetest.get_meta(pos):get_inventory()
local fake_stack = inv:get_stack("main", index)
fake_stack:take_item(stack:get_count())
inv:set_stack("main", index, fake_stack)
return 0
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if not pipeworks.may_configure(pos, player) then return 0 end
@ -481,3 +499,64 @@ if minetest.get_modpath("digilines") then
},
})
end
--[[
In the past the filter-injectors had real items in their inventories. This code
puts them to the input to the filter-injector if possible. Else the items are
dropped.
]]
local function put_to_inputinv(pos, node, filtmeta, list)
local dir = pipeworks.facedir_to_right_dir(node.param2)
local frompos = vector.subtract(pos, dir)
local fromnode = minetest.get_node(frompos)
local fromdef = minetest.registered_nodes[fromnode.name]
if not fromdef or not fromdef.tube then
return
end
local fromtube = fromdef.tube
local frominv
if fromtube.return_input_invref then
local owner = filtmeta:get_string("owner")
frominv = fromtube.return_input_invref(frompos, fromnode, dir, owner)
if not frominv then
return
end
else
frominv = minetest.get_meta(frompos):get_inventory()
end
local listname = type(fromtube.input_inventory) == "table" and
fromtube.input_inventory[1] or fromtube.input_inventory
if not listname then
return
end
for i = 1, #list do
local item = list[i]
if not item:is_empty() then
local leftover = frominv:add_item(listname, item)
if not leftover:is_empty() then
minetest.add_item(pos, leftover)
end
end
end
return true
end
minetest.register_lbm({
label = "Give back items of old filters that had real inventories",
name = "pipeworks:give_back_old_filter_items",
nodenames = {"pipeworks:filter", "pipeworks:mese_filter"},
run_at_every_load = false,
action = function(pos, node)
local meta = minetest.get_meta(pos)
local list = meta:get_inventory():get_list("main")
if put_to_inputinv(pos, node, meta, list) then
return
end
pos.y = pos.y + 1
for i = 1, #list do
local item = list[i]
if not item:is_empty() then
minetest.add_item(pos, item)
end
end
end,
})

View File

@ -38,6 +38,7 @@ pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y
{x=0, y=1, z=0}, {x=0, y=-1, z=0}}
pipeworks.mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}}
pipeworks.digilines_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}}
pipeworks.liquid_texture = "default_water.png"
@ -118,6 +119,7 @@ if pipeworks.enable_redefines then
dofile(pipeworks.modpath.."/compat-furnaces.lua")
end
if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end
if pipeworks.enable_lua_tube then dofile(pipeworks.modpath.."/lua_tube.lua") end
minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty")

View File

@ -7,13 +7,14 @@ function pipeworks.tube_item(pos, item)
error("obsolete pipeworks.tube_item() called; change caller to use pipeworks.tube_inject_item() instead")
end
function pipeworks.tube_inject_item(pos, start_pos, velocity, item)
function pipeworks.tube_inject_item(pos, start_pos, velocity, item, owner)
-- Take item in any format
local stack = ItemStack(item)
local obj = luaentity.add_entity(pos, "pipeworks:tubed_item")
obj:set_item(stack:to_string())
obj.start_pos = vector.new(start_pos)
obj:setvelocity(velocity)
obj.owner = owner
--obj:set_color("red") -- todo: this is test-only code
return obj
end
@ -49,7 +50,7 @@ minetest.register_globalstep(function(dtime)
end
end)
local function go_next(pos, velocity, stack)
local function go_next(pos, velocity, stack, owner)
local next_positions = {}
local max_priority = 0
local cnode = minetest.get_node(pos)
@ -84,7 +85,7 @@ local function go_next(pos, velocity, stack)
local tube_priority = (tube_def and tube_def.priority) or 100
if tubedevice > 0 and tube_priority >= max_priority then
if not tube_def or not tube_def.can_insert or
tube_def.can_insert(npos, node, stack, vect) then
tube_def.can_insert(npos, node, stack, vect, owner) then
if tube_priority > max_priority then
max_priority = tube_priority
next_positions = {}
@ -260,7 +261,7 @@ luaentity.register_entity("pipeworks:tubed_item", {
if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then
local leftover
if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then
leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel)
leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel, self.owner)
else
leftover = stack
end
@ -276,7 +277,7 @@ luaentity.register_entity("pipeworks:tubed_item", {
end
if moved then
local found_next, new_velocity = go_next(self.start_pos, velocity, stack) -- todo: color
local found_next, new_velocity = go_next(self.start_pos, velocity, stack, self.owner) -- todo: color
local rev_vel = vector.multiply(velocity, -1)
local rev_dir = vector.direction(self.start_pos,vector.add(self.start_pos,rev_vel))
local rev_node = minetest.get_node(vector.round(vector.add(self.start_pos,rev_dir)))

850
pipeworks/lua_tube.lua Normal file
View File

@ -0,0 +1,850 @@
-- ______
-- |
-- |
-- | __ ___ _ __ _ _
-- | | | | | |\ | | |_| | | | | |_ |_|
-- |___| |______ |__| | \| | | \ |__| |_ |_ |_ |\ tube
-- |
-- |
--
-- Reference
-- ports = get_real_port_states(pos): gets if inputs are powered from outside
-- newport = merge_port_states(state1, state2): just does result = state1 or state2 for every port
-- set_port(pos, rule, state): activates/deactivates the mesecons according to the port states
-- set_port_states(pos, ports): Applies new port states to a Luacontroller at pos
-- run(pos): runs the code in the controller at pos
-- reset_meta(pos, code, errmsg): performs a software-reset, installs new code and prints error messages
-- resetn(pos): performs a hardware reset, turns off all ports
--
-- The Sandbox
-- The whole code of the controller runs in a sandbox,
-- a very restricted environment.
-- Actually the only way to damage the server is to
-- use too much memory from the sandbox.
-- You can add more functions to the environment
-- (see where local env is defined)
-- Something nice to play is is appending minetest.env to it.
local BASENAME = "pipeworks:lua_tube"
local rules = {
red = {x = -1, y = 0, z = 0, name = "red"},
blue = {x = 1, y = 0, z = 0, name = "blue"},
yellow = {x = 0, y = -1, z = 0, name = "yellow"},
green = {x = 0, y = 1, z = 0, name = "green"},
black = {x = 0, y = 0, z = -1, name = "black"},
white = {x = 0, y = 0, z = 1, name = "white"},
}
------------------
-- Action stuff --
------------------
-- These helpers are required to set the port states of the lua_tube
local function update_real_port_states(pos, rule_name, new_state)
local meta = minetest.get_meta(pos)
if rule_name == nil then
meta:set_int("real_portstates", 1)
return
end
local n = meta:get_int("real_portstates") - 1
local L = {}
for i = 1, 6 do
L[i] = n % 2
n = math.floor(n / 2)
end
-- (0,0,-1) (0,-1,0) (-1,0,0) (1,0,0) (0,1,0) (0,0,1)
local pos_to_side = { 5, 3, 1, nil, 2, 4, 6 }
if rule_name.x == nil then
for _, rname in ipairs(rule_name) do
local port = pos_to_side[rname.x + (2 * rname.y) + (3 * rname.z) + 4]
L[port] = (newstate == "on") and 1 or 0
end
else
local port = pos_to_side[rule_name.x + (2 * rule_name.y) + (3 * rule_name.z) + 4]
L[port] = (new_state == "on") and 1 or 0
end
meta:set_int("real_portstates",
1 +
1 * L[1] +
2 * L[2] +
4 * L[3] +
8 * L[4] +
16 * L[5] +
32 * L[6])
end
local port_names = {"red", "blue", "yellow", "green", "black", "white"}
local function get_real_port_states(pos)
-- Determine if ports are powered (by itself or from outside)
local meta = minetest.get_meta(pos)
local L = {}
local n = meta:get_int("real_portstates") - 1
for _, name in ipairs(port_names) do
L[name] = ((n % 2) == 1)
n = math.floor(n / 2)
end
return L
end
local function merge_port_states(ports, vports)
return {
red = ports.red or vports.red,
blue = ports.blue or vports.blue,
yellow = ports.yellow or vports.yellow,
green = ports.green or vports.green,
black = ports.black or vports.black,
white = ports.white or vports.white,
}
end
local function generate_name(ports)
local red = ports.red and 1 or 0
local blue = ports.blue and 1 or 0
local yellow = ports.yellow and 1 or 0
local green = ports.green and 1 or 0
local black = ports.black and 1 or 0
local white = ports.white and 1 or 0
return BASENAME..white..black..green..yellow..blue..red
end
local function set_port(pos, rule, state)
if state then
mesecon.receptor_on(pos, {rule})
else
mesecon.receptor_off(pos, {rule})
end
end
local function clean_port_states(ports)
ports.red = ports.red and true or false
ports.blue = ports.blue and true or false
ports.yellow = ports.yellow and true or false
ports.green = ports.green and true or false
ports.black = ports.black and true or false
ports.white = ports.white and true or false
end
local function set_port_states(pos, ports)
local node = minetest.get_node(pos)
local name = node.name
clean_port_states(ports)
local vports = minetest.registered_nodes[name].virtual_portstates
local new_name = generate_name(ports)
if name ~= new_name and vports then
-- Problem:
-- We need to place the new node first so that when turning
-- off some port, it won't stay on because the rules indicate
-- there is an onstate output port there.
-- When turning the output off then, it will however cause feedback
-- so that the lua_tube will receive an "off" event by turning
-- its output off.
-- Solution / Workaround:
-- Remember which output was turned off and ignore next "off" event.
local meta = minetest.get_meta(pos)
local ign = minetest.deserialize(meta:get_string("ignore_offevents")) or {}
if ports.red and not vports.red and not mesecon.is_powered(pos, rules.red) then ign.red = true end
if ports.blue and not vports.blue and not mesecon.is_powered(pos, rules.blue) then ign.blue = true end
if ports.yellow and not vports.yellow and not mesecon.is_powered(pos, rules.yellow) then ign.yellow = true end
if ports.green and not vports.green and not mesecon.is_powered(pos, rules.green) then ign.green = true end
if ports.black and not vports.black and not mesecon.is_powered(pos, rules.black) then ign.black = true end
if ports.white and not vports.white and not mesecon.is_powered(pos, rules.white) then ign.white = true end
meta:set_string("ignore_offevents", minetest.serialize(ign))
minetest.swap_node(pos, {name = new_name, param2 = node.param2})
if ports.red ~= vports.red then set_port(pos, rules.red, ports.red) end
if ports.blue ~= vports.blue then set_port(pos, rules.blue, ports.blue) end
if ports.yellow ~= vports.yellow then set_port(pos, rules.yellow, ports.yellow) end
if ports.green ~= vports.green then set_port(pos, rules.green, ports.green) end
if ports.black ~= vports.black then set_port(pos, rules.black, ports.black) end
if ports.white ~= vports.white then set_port(pos, rules.white, ports.white) end
end
end
-----------------
-- Overheating --
-----------------
local function burn_controller(pos)
local node = minetest.get_node(pos)
node.name = BASENAME.."_burnt"
minetest.swap_node(pos, node)
minetest.get_meta(pos):set_string("lc_memory", "");
-- Wait for pending operations
minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat)
end
local function overheat(pos, meta)
if mesecon.do_overheat(pos) then -- If too hot
burn_controller(pos)
return true
end
end
------------------------
-- Ignored off events --
------------------------
local function ignore_event(event, meta)
if event.type ~= "off" then return false end
local ignore_offevents = minetest.deserialize(meta:get_string("ignore_offevents")) or {}
if ignore_offevents[event.pin.name] then
ignore_offevents[event.pin.name] = nil
meta:set_string("ignore_offevents", minetest.serialize(ignore_offevents))
return true
end
end
-------------------------
-- Parsing and running --
-------------------------
local function safe_print(param)
print(dump(param))
end
local function safe_date()
return(os.date("*t",os.time()))
end
-- string.rep(str, n) with a high value for n can be used to DoS
-- the server. Therefore, limit max. length of generated string.
local function safe_string_rep(str, n)
if #str * n > mesecon.setting("luacontroller_string_rep_max", 64000) then
debug.sethook() -- Clear hook
error("string.rep: string length overflow", 2)
end
return string.rep(str, n)
end
-- string.find with a pattern can be used to DoS the server.
-- Therefore, limit string.find to patternless matching.
local function safe_string_find(...)
if (select(4, ...)) ~= true then
debug.sethook() -- Clear hook
error("string.find: 'plain' (fourth parameter) must always be true in a lua controlled tube")
end
return string.find(...)
end
local function remove_functions(x)
local tp = type(x)
if tp == "function" then
return nil
end
-- Make sure to not serialize the same table multiple times, otherwise
-- writing mem.test = mem in the lua controlled tube will lead to infinite recursion
local seen = {}
local function rfuncs(x)
if seen[x] then return end
seen[x] = true
if type(x) ~= "table" then return end
for key, value in pairs(x) do
if type(key) == "function" or type(value) == "function" then
x[key] = nil
else
if type(key) == "table" then
rfuncs(key)
end
if type(value) == "table" then
rfuncs(value)
end
end
end
end
rfuncs(x)
return x
end
local function get_interrupt(pos)
-- iid = interrupt id
local function interrupt(time, iid)
if type(time) ~= "number" then return end
local luac_id = minetest.get_meta(pos):get_int("luac_id")
mesecon.queue:add_action(pos, "pipeworks:lc_tube_interrupt", {luac_id, iid}, time, iid, 1)
end
return interrupt
end
local function get_digiline_send(pos)
if not digiline then return end
return function(channel, msg)
-- Make sure channel is string, number or boolean
if (type(channel) ~= "string" and type(channel) ~= "number" and type(channel) ~= "boolean") then
return false
end
-- It is technically possible to send functions over the wire since
-- the high performance impact of stripping those from the data has
-- been decided to not be worth the added realism.
-- Make sure serialized version of the data is not insanely long to
-- prevent DoS-like attacks
local msg_ser = minetest.serialize(msg)
if #msg_ser > mesecon.setting("luacontroller_digiline_maxlen", 50000) then
return false
end
minetest.after(0, function()
digilines.receptor_send(pos, digiline.rules.default, channel, msg)
end)
return true
end
end
local safe_globals = {
"assert", "error", "ipairs", "next", "pairs", "select",
"tonumber", "tostring", "type", "unpack", "_VERSION"
}
local function create_environment(pos, mem, event)
-- Gather variables for the environment
local vports = minetest.registered_nodes[minetest.get_node(pos).name].virtual_portstates
local vports_copy = {}
for k, v in pairs(vports) do vports_copy[k] = v end
local rports = get_real_port_states(pos)
-- Create new library tables on each call to prevent one Luacontroller
-- from breaking a library and messing up other Luacontrollers.
local env = {
pin = merge_port_states(vports, rports),
port = vports_copy,
event = event,
mem = mem,
heat = mesecon.get_heat(pos),
heat_max = mesecon.setting("overheat_max", 20),
print = safe_print,
interrupt = get_interrupt(pos),
digiline_send = get_digiline_send(pos),
string = {
byte = string.byte,
char = string.char,
format = string.format,
len = string.len,
lower = string.lower,
upper = string.upper,
rep = safe_string_rep,
reverse = string.reverse,
sub = string.sub,
find = safe_string_find,
},
math = {
abs = math.abs,
acos = math.acos,
asin = math.asin,
atan = math.atan,
atan2 = math.atan2,
ceil = math.ceil,
cos = math.cos,
cosh = math.cosh,
deg = math.deg,
exp = math.exp,
floor = math.floor,
fmod = math.fmod,
frexp = math.frexp,
huge = math.huge,
ldexp = math.ldexp,
log = math.log,
log10 = math.log10,
max = math.max,
min = math.min,
modf = math.modf,
pi = math.pi,
pow = math.pow,
rad = math.rad,
random = math.random,
sin = math.sin,
sinh = math.sinh,
sqrt = math.sqrt,
tan = math.tan,
tanh = math.tanh,
},
table = {
concat = table.concat,
insert = table.insert,
maxn = table.maxn,
remove = table.remove,
sort = table.sort,
},
os = {
clock = os.clock,
difftime = os.difftime,
time = os.time,
datetable = safe_date,
},
}
env._G = env
for _, name in pairs(safe_globals) do
env[name] = _G[name]
end
return env
end
local function timeout()
debug.sethook() -- Clear hook
error("Code timed out!", 2)
end
local function create_sandbox(code, env)
if code:byte(1) == 27 then
return nil, "Binary code prohibited."
end
local f, msg = loadstring(code)
if not f then return nil, msg end
setfenv(f, env)
-- Turn off JIT optimization for user code so that count
-- events are generated when adding debug hooks
if rawget(_G, "jit") then
jit.off(f, true)
end
return function(...)
-- Use instruction counter to stop execution
-- after luacontroller_maxevents
local maxevents = mesecon.setting("luacontroller_maxevents", 10000)
debug.sethook(timeout, "", maxevents)
local ok, ret = pcall(f, ...)
debug.sethook() -- Clear hook
if not ok then error(ret, 0) end
return ret
end
end
local function load_memory(meta)
return minetest.deserialize(meta:get_string("lc_memory")) or {}
end
local function save_memory(pos, meta, mem)
local memstring = minetest.serialize(remove_functions(mem))
local memsize_max = mesecon.setting("luacontroller_memsize", 100000)
if (#memstring <= memsize_max) then
meta:set_string("lc_memory", memstring)
else
print("Error: lua_tube memory overflow. "..memsize_max.." bytes available, "
..#memstring.." required. Controller overheats.")
burn_controller(pos)
end
end
local function run(pos, event)
local meta = minetest.get_meta(pos)
if overheat(pos) then return end
if ignore_event(event, meta) then return end
-- Load code & mem from meta
local mem = load_memory(meta)
local code = meta:get_string("code")
-- Create environment
local env = create_environment(pos, mem, event)
-- Create the sandbox and execute code
local f, msg = create_sandbox(code, env)
if not f then return false, msg end
local succ, msg = pcall(f)
if not succ then return false, msg end
if type(env.port) ~= "table" then
return false, "Ports set are invalid."
end
-- Actually set the ports
set_port_states(pos, env.port)
-- Save memory. This may burn the luacontroller if a memory overflow occurs.
save_memory(pos, meta, env.mem)
return succ, msg
end
mesecon.queue:add_function("pipeworks:lc_tube_interrupt", function (pos, luac_id, iid)
-- There is no lua_tube anymore / it has been reprogrammed / replaced / burnt
if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end
if (minetest.registered_nodes[minetest.get_node(pos).name].is_burnt) then return end
run(pos, {type = "interrupt", iid = iid})
end)
local function reset_meta(pos, code, errmsg)
local meta = minetest.get_meta(pos)
meta:set_string("code", code)
code = minetest.formspec_escape(code or "")
errmsg = minetest.formspec_escape(tostring(errmsg or ""))
meta:set_string("formspec", "size[12,10]"..
"background[-0.2,-0.25;12.4,10.75;jeija_luac_background.png]"..
"textarea[0.2,0.2;12.2,9.5;code;;"..code.."]"..
"image_button[4.75,8.75;2.5,1;jeija_luac_runbutton.png;program;]"..
"image_button_exit[11.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]"..
"label[0.1,9;"..errmsg.."]")
meta:set_int("luac_id", math.random(1, 65535))
end
local function reset(pos)
set_port_states(pos, {red = false, blue = false, yellow = false,
green = false, black = false, white = false})
end
-----------------------
-- Node Registration --
-----------------------
local output_rules = {}
local input_rules = {}
local node_box = {
type = "fixed",
fixed = {
pipeworks.tube_leftstub[1], -- tube segment against -X face
pipeworks.tube_rightstub[1], -- tube segment against +X face
pipeworks.tube_bottomstub[1], -- tube segment against -Y face
pipeworks.tube_topstub[1], -- tube segment against +Y face
pipeworks.tube_frontstub[1], -- tube segment against -Z face
pipeworks.tube_backstub[1], -- tube segment against +Z face
}
}
local selection_box = {
type = "fixed",
fixed = pipeworks.tube_selectboxes,
}
local digiline = {
receptor = {},
effector = {
action = function(pos, node, channel, msg)
run(pos, {type = "digiline", channel = channel, msg = msg})
end
}
}
local function on_receive_fields(pos, form_name, fields, sender)
if not fields.program then
return
end
local name = sender:get_player_name()
if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then
minetest.record_protection_violation(pos, name)
return
end
reset(pos)
reset_meta(pos, fields.code)
local succ, err = run(pos, {type="program"})
if not succ then
print(err)
reset_meta(pos, fields.code, err)
end
end
local function go_back(velocity)
local adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}}
local speed = math.abs(velocity.x + velocity.y + velocity.z)
if speed == 0 then
speed = 1
end
local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed,speed=speed}
if speed >= 4.1 then
speed = 4
elseif speed >= 1.1 then
speed = speed - 0.1
else
speed = 1
end
vel.speed = speed
return pipeworks.notvel(adjlist, vel)
end
local tiles_base = {
"pipeworks_mese_tube_plain_4.png", "pipeworks_mese_tube_plain_3.png",
"pipeworks_mese_tube_plain_2.png", "pipeworks_mese_tube_plain_1.png",
"pipeworks_mese_tube_plain_6.png", "pipeworks_mese_tube_plain_5.png"}
for red = 0, 1 do -- 0 = off 1 = on
for blue = 0, 1 do
for yellow = 0, 1 do
for green = 0, 1 do
for black = 0, 1 do
for white = 0, 1 do
local cid = tostring(white)..tostring(black)..tostring(green)..
tostring(yellow)..tostring(blue)..tostring(red)
local node_name = BASENAME..cid
local tiles = table.copy(tiles_base)
if red == 1 then
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
else
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
end
if blue == 1 then
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
else
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
end
if yellow == 1 then
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
else
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
end
if green == 1 then
tiles[3] = tiles[3].."^pipeworks_lua_tube_port_on.png"
tiles[4] = tiles[4].."^pipeworks_lua_tube_port_on.png"
tiles[5] = tiles[5].."^pipeworks_lua_tube_port_on.png"
tiles[6] = tiles[6].."^pipeworks_lua_tube_port_on.png"
else
tiles[3] = tiles[3].."^pipeworks_lua_tube_port_off.png"
tiles[4] = tiles[4].."^pipeworks_lua_tube_port_off.png"
tiles[5] = tiles[5].."^pipeworks_lua_tube_port_off.png"
tiles[6] = tiles[6].."^pipeworks_lua_tube_port_off.png"
end
if black == 1 then
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
tiles[2] = tiles[2].."^pipeworks_lua_tube_port_on.png"
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
else
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
tiles[2] = tiles[2].."^pipeworks_lua_tube_port_off.png"
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
end
if white == 1 then
tiles[1] = tiles[1].."^pipeworks_lua_tube_port_on.png"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
else
tiles[1] = tiles[1].."^pipeworks_lua_tube_port_off.png"
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
end
local groups = {snappy = 3, tube = 1, tubedevice = 1, overheat = 1}
if red + blue + yellow + green + black + white ~= 0 then
groups.not_in_creative_inventory = 1
end
output_rules[cid] = {}
input_rules[cid] = {}
if red == 1 then table.insert(output_rules[cid], rules.red) end
if blue == 1 then table.insert(output_rules[cid], rules.blue) end
if yellow == 1 then table.insert(output_rules[cid], rules.yellow) end
if green == 1 then table.insert(output_rules[cid], rules.green) end
if black == 1 then table.insert(output_rules[cid], rules.black) end
if white == 1 then table.insert(output_rules[cid], rules.white) end
if red == 0 then table.insert( input_rules[cid], rules.red) end
if blue == 0 then table.insert( input_rules[cid], rules.blue) end
if yellow == 0 then table.insert( input_rules[cid], rules.yellow) end
if green == 0 then table.insert( input_rules[cid], rules.green) end
if black == 0 then table.insert( input_rules[cid], rules.black) end
if white == 0 then table.insert( input_rules[cid], rules.white) end
local mesecons = {
effector = {
rules = input_rules[cid],
action_change = function (pos, _, rule_name, new_state)
update_real_port_states(pos, rule_name, new_state)
run(pos, {type=new_state, pin=rule_name})
end,
},
receptor = {
state = mesecon.state.on,
rules = output_rules[cid]
}
}
minetest.register_node(node_name, {
description = "Lua controlled Tube",
drawtype = "nodebox",
tiles = tiles,
paramtype = "light",
groups = groups,
drop = BASENAME.."000000",
sunlight_propagates = true,
selection_box = selection_box,
node_box = node_box,
on_construct = reset_meta,
on_receive_fields = on_receive_fields,
sounds = default.node_sound_wood_defaults(),
mesecons = mesecons,
digiline = digiline,
-- Virtual portstates are the ports that
-- the node shows as powered up (light up).
virtual_portstates = {
red = red == 1,
blue = blue == 1,
yellow = yellow == 1,
green = green == 1,
black = black == 1,
white = white == 1,
},
after_dig_node = function(pos, node)
mesecon.do_cooldown(pos)
mesecon.receptor_off(pos, output_rules)
pipeworks.after_dig(pos, node)
end,
is_luacontroller = true,
tubelike = 1,
tube = {
connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1},
priority = 50,
can_go = function(pos, node, velocity, stack)
local succ, msg = run(pos, {
type = "item",
itemstring = stack:to_string(),
item = stack:to_table(),
velocity = velocity,
})
if not succ or type(msg) ~= "string" then
return go_back(velocity)
end
local r = rules[msg]
return r and {r} or go_back(velocity)
end,
},
after_place_node = pipeworks.after_place,
on_blast = function(pos, intensity)
if not intensity or intensity > 1 + 3^0.5 then
minetest.remove_node(pos)
return {string.format("%s_%s", name, dropname)}
end
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
pipeworks.scan_for_tube_objects(pos)
end,
on_blast = function(pos, intensity)
if not intensity or intensity > 1 + 3^0.5 then
minetest.remove_node(pos)
return {string.format("%s_%s", name, dropname)}
end
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
pipeworks.scan_for_tube_objects(pos)
end,
})
end
end
end
end
end
end
------------------------------------
-- Overheated Lua controlled Tube --
------------------------------------
local tiles_burnt = table.copy(tiles_base)
tiles_burnt[1] = tiles_burnt[1].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
tiles_burnt[2] = tiles_burnt[2].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
tiles_burnt[5] = tiles_burnt[5].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[6] = tiles_burnt[6].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
tiles_burnt[1] = tiles_burnt[1].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[2] = tiles_burnt[2].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[5] = tiles_burnt[5].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
tiles_burnt[6] = tiles_burnt[6].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[3] = tiles_burnt[3].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[4] = tiles_burnt[4].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[5] = tiles_burnt[5].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[6] = tiles_burnt[6].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[3] = tiles_burnt[3].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[4] = tiles_burnt[4].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[5] = tiles_burnt[5].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[6] = tiles_burnt[6].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[1] = tiles_burnt[1].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[2] = tiles_burnt[2].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[3] = tiles_burnt[3].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
tiles_burnt[4] = tiles_burnt[4].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[1] = tiles_burnt[1].."^pipeworks_lua_tube_port_burnt.png"
tiles_burnt[2] = tiles_burnt[2].."^(pipeworks_lua_tube_port_burnt.png^[transformR180)"
tiles_burnt[3] = tiles_burnt[3].."^(pipeworks_lua_tube_port_burnt.png^[transformR270)"
tiles_burnt[4] = tiles_burnt[4].."^(pipeworks_lua_tube_port_burnt.png^[transformR90)"
minetest.register_node(BASENAME .. "_burnt", {
drawtype = "nodebox",
tiles = tiles_burnt,
is_burnt = true,
paramtype = "light",
groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1},
drop = BASENAME.."000000",
sunlight_propagates = true,
selection_box = selection_box,
node_box = node_box,
on_construct = reset_meta,
on_receive_fields = on_receive_fields,
sounds = default.node_sound_wood_defaults(),
virtual_portstates = {red = false, blue = false, yellow = false,
green = false, black = false, white = false},
mesecons = {
effector = {
rules = mesecon.rules.alldirs,
action_change = function(pos, _, rule_name, new_state)
update_real_port_states(pos, rule_name, new_state)
end,
},
},
tubelike = 1,
tube = {
connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1},
priority = 50,
},
after_place_node = pipeworks.after_place,
after_dig_node = pipeworks.after_dig,
on_blast = function(pos, intensity)
if not intensity or intensity > 1 + 3^0.5 then
minetest.remove_node(pos)
return {string.format("%s_%s", name, dropname)}
end
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
pipeworks.scan_for_tube_objects(pos)
end,
})
------------------------
-- Craft Registration --
------------------------
minetest.register_craft({
type = "shapeless",
output = BASENAME.."000000",
recipe = {"pipeworks:mese_tube_000000", "mesecons_luacontroller:luacontroller0000"},
})

View File

@ -33,8 +33,8 @@ pipeworks.tube_frontstub = {
}
pipeworks.tube_backstub = {
{ -9/64, -9/64, -9/64, 9/64, 9/64, 32/64 }, -- tube segment against -Z face
}
{ -9/64, -9/64, -9/64, 9/64, 9/64, 32/64 }, -- tube segment against +Z face
}
pipeworks.tube_boxes = {pipeworks.tube_leftstub, pipeworks.tube_rightstub, pipeworks.tube_bottomstub, pipeworks.tube_topstub, pipeworks.tube_frontstub, pipeworks.tube_backstub}

View File

@ -34,6 +34,9 @@ pipeworks_enable_digiline_detector_tube (Enable Digiline Detector Tube) bool tru
#Enable mesecon signal conducting tube.
pipeworks_enable_conductor_tube (Enable Conductor Tube) bool true
#Enable digiline signal conducting tube.
pipeworks_enable_digiline_conductor_tube (Enable Digiline Conductor Tube) bool true
#Enable accelerator tube.
pipeworks_enable_accelerator_tube (Enable Accelerator Tube) bool true
@ -60,6 +63,10 @@ pipeworks_enable_one_way_tube (Enable One Way Tube) bool true
#always go to it if there are multible ways.
pipeworks_enable_priority_tube (Enable High Priority Tube) bool true
#Enable lua controlled tube.
#It is comparable with mesecons luacontroller.
pipeworks_enable_lua_tube (Enable Lua controlled Tube) bool true
#Enable cyclic mode.
pipeworks_enable_cyclic_mode (Enable Cyclic Mode) bool true
@ -67,4 +74,4 @@ pipeworks_enable_cyclic_mode (Enable Cyclic Mode) bool true
pipeworks_drop_on_routing_fail (Drop On Routing Fail) bool false
#Delete item on clearobject.
pipeworks_delete_item_on_clearobject (Delete Item On Clearobject) bool true
pipeworks_delete_item_on_clearobject (Delete Item On Clearobject) bool true

View File

@ -67,7 +67,8 @@ if pipeworks.enable_detector_tube then
})
end
if minetest.get_modpath("digilines") and pipeworks.enable_digiline_detector_tube then
local digiline_enabled = minetest.get_modpath("digilines") ~= nil
if digiline_enabled and pipeworks.enable_digiline_detector_tube then
pipeworks.register_tube("pipeworks:digiline_detector_tube", {
description = "Digiline Detecting Pneumatic Tube Segment",
inventory_image = "pipeworks_digiline_detector_tube_inv.png",
@ -147,14 +148,80 @@ if pipeworks.enable_conductor_tube then
},
})
minetest.register_craft( {
output = "pipeworks:conductor_tube_off_1 6",
recipe = {
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
{ "mesecons:mesecon", "mesecons:mesecon", "mesecons:mesecon" },
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
},
minetest.register_craft({
type = "shapeless",
output = "pipeworks:conductor_tube_off_1",
recipe = {"pipeworks:tube_1", "mesecons:mesecon"}
})
end
if digiline_enabled and pipeworks.enable_digiline_conductor_tube then
pipeworks.register_tube("pipeworks:digiline_conductor_tube", {
description = "Digiline Conducting Pneumatic Tube Segment",
inventory_image = "pipeworks_tube_inv.png^pipeworks_digiline_conductor_tube_inv.png",
short = "pipeworks_tube_short.png^pipeworks_digiline_conductor_tube_short.png",
plain = {"pipeworks_tube_plain.png^pipeworks_digiline_conductor_tube_plain.png"},
noctr = {"pipeworks_tube_noctr.png^pipeworks_digiline_conductor_tube_noctr.png"},
ends = {"pipeworks_tube_end.png^pipeworks_digiline_conductor_tube_end.png"},
node_def = {digiline = {wire = {rules = pipeworks.digilines_rules}}},
})
minetest.register_craft({
type = "shapeless",
output = "pipeworks:digiline_conductor_tube_1",
recipe = {"pipeworks:tube_1", "digilines:wire_std_00000000"}
})
end
if digiline_enabled and pipeworks.enable_digiline_conductor_tube and
pipeworks.enable_conductor_tube then
pipeworks.register_tube("pipeworks:mesecon_and_digiline_conductor_tube_off", {
description = "Mesecon and Digiline Conducting Pneumatic Tube Segment",
inventory_image = "pipeworks_conductor_tube_inv.png^pipeworks_digiline_conductor_tube_inv.png",
short = "pipeworks_conductor_tube_short.png^pipeworks_digiline_conductor_tube_short.png",
plain = {"pipeworks_conductor_tube_plain.png^pipeworks_digiline_conductor_tube_plain.png"},
noctr = {"pipeworks_conductor_tube_noctr.png^pipeworks_digiline_conductor_tube_noctr.png"},
ends = {"pipeworks_conductor_tube_end.png^pipeworks_digiline_conductor_tube_end.png"},
node_def = {
digiline = {wire = {rules = pipeworks.digilines_rules}},
groups = {mesecon = 2},
mesecons = {conductor = {
state = "off",
rules = pipeworks.mesecons_rules,
onstate = "pipeworks:mesecon_and_digiline_conductor_tube_on_#id"
}},
},
})
pipeworks.register_tube("pipeworks:mesecon_and_digiline_conductor_tube_on", {
description = "Mesecon and Digiline Conducting Pneumatic Tube Segment on (you hacker you)",
inventory_image = "pipeworks_conductor_tube_inv.png^pipeworks_digiline_conductor_tube_inv.png",
short = "pipeworks_conductor_tube_short.png^pipeworks_digiline_conductor_tube_short.png",
plain = {"pipeworks_conductor_tube_on_plain.png^pipeworks_digiline_conductor_tube_plain.png"},
noctr = {"pipeworks_conductor_tube_on_noctr.png^pipeworks_digiline_conductor_tube_noctr.png"},
ends = {"pipeworks_conductor_tube_on_end.png^pipeworks_digiline_conductor_tube_end.png"},
node_def = {
digiline = {wire = {rules = pipeworks.digilines_rules}},
groups = {mesecon = 2, not_in_creative_inventory = 1},
drop = "pipeworks:mesecon_and_digiline_conductor_tube_off_1",
mesecons = {conductor = {
state = "on",
rules = pipeworks.mesecons_rules,
offstate = "pipeworks:mesecon_and_digiline_conductor_tube_off_#id"}
},
},
})
minetest.register_craft({
type = "shapeless",
output = "pipeworks:mesecon_and_digiline_conductor_tube_off_1",
recipe = {"pipeworks:tube_1", "mesecons:mesecon", "digilines:wire_std_00000000"}
})
minetest.register_craft({
type = "shapeless",
output = "pipeworks:mesecon_and_digiline_conductor_tube_off_1",
recipe = {"pipeworks:conductor_tube_off_1", "digilines:wire_std_00000000"}
})
minetest.register_craft({
type = "shapeless",
output = "pipeworks:mesecon_and_digiline_conductor_tube_off_1",
recipe = {"pipeworks:digiline_conductor_tube_1", "mesecons:mesecon"}
})
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Some files were not shown because too many files have changed in this diff Show More