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)
70
anvil/locale/fr.po
Normal 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
@ -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."
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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 = {}
|
||||
|
30
castle_farming/locale/pt_br.po
Normal 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)"
|
@ -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
|
||||
|
55
castle_lighting/locale/it.po
Normal 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"
|
@ -4,3 +4,4 @@ stairs?
|
||||
building_blocks?
|
||||
asphalt?
|
||||
streets?
|
||||
intllib?
|
||||
|
189
castle_masonry/locale/fr.po
Normal 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
@ -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"
|
@ -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({
|
||||
|
23
castle_shields/locale/it.po
Normal 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"
|
56
castle_storage/locale/it.po
Normal 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"
|
35
castle_tapestries/locale/it.po
Normal 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)"
|
31
castle_weapons/locale/it.po
Normal 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
@ -0,0 +1,6 @@
|
||||
|
||||
# Language: Russian
|
||||
# Author: inpos <inpos@yandex.ru>
|
||||
|
||||
Plastic sheet = Лист пластика
|
||||
Unprocessed Plastic base = Необработанная пластиковая основа
|
@ -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
|
||||
|
@ -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
|
||||
@ -38,6 +63,12 @@ minetest.register_node("currency:safe", {
|
||||
"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);
|
||||
@ -91,14 +122,4 @@ minetest.register_node("currency:safe", {
|
||||
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,
|
||||
})
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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
@ -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))
|
@ -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()
|
||||
|
||||
|
@ -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},
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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, {
|
||||
|
@ -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",
|
||||
|
209
farming/init.lua
@ -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
@ -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
@ -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
@ -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
@ -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 ""
|
@ -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
|
||||
|
@ -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
|
||||
|
BIN
farming/textures/farming_chili_1.png
Normal file
After Width: | Height: | Size: 113 B |
BIN
farming/textures/farming_chili_2.png
Normal file
After Width: | Height: | Size: 107 B |
BIN
farming/textures/farming_chili_3.png
Normal file
After Width: | Height: | Size: 137 B |
BIN
farming/textures/farming_chili_4.png
Normal file
After Width: | Height: | Size: 144 B |
BIN
farming/textures/farming_chili_5.png
Normal file
After Width: | Height: | Size: 154 B |
BIN
farming/textures/farming_chili_6.png
Normal file
After Width: | Height: | Size: 157 B |
BIN
farming/textures/farming_chili_7.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
farming/textures/farming_chili_8.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
farming/textures/farming_chili_bowl.png
Normal file
After Width: | Height: | Size: 183 B |
BIN
farming/textures/farming_chili_pepper.png
Normal file
After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 166 B After Width: | Height: | Size: 316 B |
BIN
farming/textures/farming_porridge.png
Normal file
After Width: | Height: | Size: 193 B |
BIN
farming/textures/farming_string.png
Normal file
After Width: | Height: | Size: 166 B |
@ -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,
|
||||
})
|
||||
|
@ -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
@ -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 загружен!"
|
||||
|
@ -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"},
|
||||
|
@ -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
|
||||
|
@ -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',
|
||||
|
@ -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
@ -4,13 +4,14 @@
|
||||
|
||||
mesecon.button_turnoff = function (pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name=="mesecons_button:button_on" then --has not been dug
|
||||
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
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_button:button_off", {
|
||||
drawtype = "nodebox",
|
||||
@ -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({
|
||||
|
@ -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")
|
||||
|
BIN
mesecons_lightstone/textures/jeija_lightstone_cyan_off.png
Normal file
After Width: | Height: | Size: 443 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_cyan_on.png
Normal file
After Width: | Height: | Size: 663 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_magenta_off.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_magenta_on.png
Normal file
After Width: | Height: | Size: 633 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_orange_off.png
Normal file
After Width: | Height: | Size: 407 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_orange_on.png
Normal file
After Width: | Height: | Size: 641 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_pink_off.png
Normal file
After Width: | Height: | Size: 349 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_pink_on.png
Normal file
After Width: | Height: | Size: 546 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_violet_off.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_violet_on.png
Normal file
After Width: | Height: | Size: 633 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_white_off.png
Normal file
After Width: | Height: | Size: 429 B |
BIN
mesecons_lightstone/textures/jeija_lightstone_white_on.png
Normal file
After Width: | Height: | Size: 357 B |
@ -144,6 +144,18 @@ end
|
||||
end
|
||||
end
|
||||
|
||||
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 = {
|
||||
@ -152,6 +164,7 @@ minetest.register_craft({
|
||||
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
yc.reset = function(pos)
|
||||
yc.action(pos, {a=false, b=false, c=false, d=false})
|
||||
|
@ -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)
|
||||
|
@ -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})
|
||||
|
||||
|
@ -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.
|
||||
--]]
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -11,8 +11,12 @@ Licensed under the zlib license. See LICENSE.md for more information.
|
||||
moreblocks = {}
|
||||
|
||||
local S
|
||||
if minetest.get_modpath("intllib") then
|
||||
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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
||||
|
@ -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 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)
|
||||
local frominv = frommeta:get_inventory()
|
||||
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,
|
||||
})
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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
@ -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"},
|
||||
})
|
@ -33,7 +33,7 @@ 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}
|
||||
|
@ -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,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",
|
||||
@ -148,13 +149,79 @@ 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" }
|
||||
},
|
||||
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
|
||||
|
BIN
pipeworks/textures/pipeworks_digiline_conductor_tube_end.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
pipeworks/textures/pipeworks_digiline_conductor_tube_inv.png
Normal file
After Width: | Height: | Size: 337 B |
BIN
pipeworks/textures/pipeworks_digiline_conductor_tube_noctr.png
Normal file
After Width: | Height: | Size: 179 B |
BIN
pipeworks/textures/pipeworks_digiline_conductor_tube_plain.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
pipeworks/textures/pipeworks_digiline_conductor_tube_short.png
Normal file
After Width: | Height: | Size: 162 B |
BIN
pipeworks/textures/pipeworks_lua_tube_port_burnt.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
pipeworks/textures/pipeworks_lua_tube_port_off.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
pipeworks/textures/pipeworks_lua_tube_port_on.png
Normal file
After Width: | Height: | Size: 178 B |